2009-11-15 2 views
0

C++로 개체를 만드는 데 문제가 있습니다. Instruction이라는 클래스를 만들고 새로운 인스턴스를 만들려고하는데 컴파일러 오류가 발생합니다.C++ new 연산자입니다. 새 인스턴스 만들기

클래스 코드 :

Instruction* inst; 
inst = new Instruction("instruction33", 33); 

나는 다음과 같은 컴파일러 오류를 얻을 :

functions.h:70: error: no matching function for call to ‘operator new(unsigned int, std::string&, int&)’ 
/usr/include/c++/4.3/new:95: note: candidates are: void* operator new(size_t) 
/usr/include/c++/4.3/new:99: note:     void* operator new(size_t, const std::nothrow_t&) 
/usr/include/c++/4.3/new:105: note:     void* operator new(size_t, void*) 

너희들이 올

class Instruction{ 

    protected: 
    string name; 
    int value; 

    public: 
    Instruction(string _name, int _value); 
    ~Instruction(); 
    void setName(string _name); 
    void setValue(int _value); 
    string getName(); 
    int getValue(); 
    virtual void execute(); 
}; 



//constructor 
inline Instruction::Instruction(string _name, int _value){ 
    name = _name; 
    value = _value; 
} 
//destructor 
inline Instruction::~Instruction(){ 
    //name = ""; 
    //value = 0; 
} 
inline void Instruction::setName(string _name){ 
    name = _name; 
} 

inline void Instruction::setValue(int _value){ 
    value = _value; 
} 

inline string Instruction::getName(){ 
     return name; 
} 

int Instruction::getValue(){ 
    return value; 
} 
inline void Instruction::execute(){ 
    cout << "still have to implement"; 
} 

이것은 내가 새 개체를 만들려고하는 방법이다 . 붙여 넣은 코드와 아무 상관이없는 사실

list <Instruction> instList; //#include <list> is in the file 
+0

완벽하게 컴파일됩니다. – Xinus

+0

코드에 문제가있는 부분을 추가했습니다. 명령어 목록에 명령어를 추가하려고하면 발생합니다. – user69514

+0

'g ++ '로 컴파일 중입니까? 나는이 코드를'gcc'로 컴파일하려했는데 비슷한 오류가있었습니다. – hbw

답변

4

inst는 명령 개체에 대한 포인터이며 instList이 명령 개체의 목록입니다 라인에 functions.h 확인했다. 따라서 instList.push_back(inst)을 시도하면 작동하지 않습니다 (포인터가 아닌 실제 객체를 기대합니다). 대신 instList.push_back(*inst)이 있어야합니다.

0

, 그것은 당신의 오류 메시지가 다음과 같습니다 instList는 다음과 같이 생성됩니다

instList.push_back(inst); 

가 : 오류 코드의이 라인에서 온다 네 OP에서. 나는 const char *를 std :: string & 매개 변수로 전달하지 않을 준비가되었지만 문제가 아닌 것으로 보이는 매우 좋은 응답을 받았습니다. 게시 한 내용만으로는 문제를 정확히 찾아 낼 수 없습니다. 붙여 넣은 코드 아무 문제가 없습니다

0

는 메시지에서 오류가 70

0

대신 :

instList.push_back(inst); 

이 시도 : 당신은 지침의 목록에 명령에 대한 포인터를 넣어 위해 노력하고

instList.push_back(*inst); 

.

+1

어쨌든 인스턴스 사본을 저장하면 동적으로 원본을 할당 할 필요가 없습니다. 시간이 낭비되는 것은 아닙니다 (동적 할당은 저렴하지 않습니다). 인스턴스를 즉시 삭제해야합니다. – UncleBens

4

동적으로 지침을 작성하지 않는 것이 좋습니다.

list <Instruction> instList; 

instList.push_back(Instruction("instruction33", 33)); 

새로운 기능을 사용할 필요가 없습니다.
새 포인터를 사용하는 경우 포인터를 삭제해야합니다.
준비가되지 않은 전체 수준의 복잡성이 추가됩니다.

+0

+1 전적으로 동의합니다. –

+0

@Martin : 범위에도 의존하지 않겠습니까? 예를 들어, 함수에서 수행 된 경우 instList가 주 프로그램으로 다시 전달 되더라도 개별 Instruction 객체는 더 이상 존재하지 않습니다. 기능 범위를 벗어 났기 때문입니다. @unknown : 그러나 이것이 선언 된 범위에서만 사용된다면 위와 같은 조치를 취해야합니다. 새로운 현명한 사용은 괜찮습니다. – Aishwar

+1

@aip : 죄송합니다. 표준 컨테이너는 실제로 전달한 객체의 복사본을 가져옵니다. 따라서 목록의 객체는 목록만큼 살아 있습니다. –

관련 문제