C ++ новый оператор. Создание нового экземпляра - PullRequest
0 голосов
/ 15 ноября 2009

У меня возникли проблемы с созданием объекта в C ++. Я создаю класс с именем Instruction и пытаюсь создать новый экземпляр, но получаю ошибки компилятора.

Код класса:

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";
}

Вот как я пытаюсь создать новый объект:

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*)

Вы, ребята, правы. Ошибка происходит из этой строки кода:

instList.push_back(inst);

где instList создается так:

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

Ответы [ 5 ]

4 голосов
/ 15 ноября 2009

Я думаю, что вам лучше не динамически создавать Инструкцию.

list <Instruction> instList;

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

Обратите внимание, что нет необходимости использовать новый.
Если вы используете новый, вы должны удалить указатель.
Это добавляет целый уровень сложности, к которому вы не готовы.

4 голосов
/ 15 ноября 2009

inst - указатель на объект Инструкции, а instList - список объектов Инструкции. Поэтому, когда вы пытаетесь instList.push_back(inst), он не работает (он ожидает реального объекта, а не указателя на него). Вместо этого вы должны иметь instList.push_back(*inst).

0 голосов
/ 15 ноября 2009

Вместо:

instList.push_back(inst);

попробуйте это:

instList.push_back(*inst);

Вы пытаетесь поместить указатель на инструкцию в список инструкций.

0 голосов
/ 15 ноября 2009

В коде, который вы вставили, нет ничего плохого, в сообщении об ошибке говорится о проверке functions.h в строке 70.

0 голосов
/ 15 ноября 2009

на самом деле, похоже, что ваше сообщение об ошибке не имеет ничего общего с кодом, который вы вставили в ваш OP. У меня был очень хороший ответ, готовый не передавать const char * в качестве параметра std :: string &, но это не похоже на вашу проблему. То, что вы опубликовали, недостаточно для точного определения проблемы.

...