C ++ конструктор и деструктор - PullRequest
2 голосов
/ 15 ноября 2009

Я получаю некоторые ошибки при компиляции моей программы. Они относятся к конструктору и деструктору моего класса Инструкция.

Ошибки:

/tmp/ccSWO7VW.o: In function `Instruction::Instruction(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
ale.c:(.text+0x241): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::Instruction(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
ale.c:(.text+0x2ab): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::~Instruction()':
ale.c:(.text+0x315): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::~Instruction()':
ale.c:(.text+0x38d): undefined reference to `vtable for Instruction'
collect2: ld returned 1 exit status

Вот мой код:

//classses.h

#include <iostream>
#include <string>
using namespace std;

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
Instruction::Instruction(string _name, int _value){
    name = _name;
    value = _value;
}
//destructor
Instruction::~Instruction(){
    name = "";
    value = 0;
}
void Instruction::setName(string _name){
     name = _name;
}

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

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

int Instruction::getValue(){
    return value;
}

/////////////////////////////////////////////// //////////////////////

//ale.cpp

    #include "headers.h"
    #include "functions.h"
    #include "classes.h"
    #include <list>


    using namespace std;

    int main(){

    return 0;
    }

Ответы [ 4 ]

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

Полагаю, проблема в том, что вы объявили виртуальный метод execute в классе Instruction и никогда его нигде не определяли. Компиляторы должны создать объект vtable для класса с виртуальными методами и действительно хотят получить только одну его копию, поэтому они обычно просто делают это в модуле компиляции (исходном файле), который определяет первую виртуальную функцию ...

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

Вы не определили свою виртуальную функцию и / или g ++ хочет, чтобы вы сделали виртуальный деструктор (поскольку у вас есть виртуальные функции, которые предполагают наследование)

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

Попробуйте

virtual void execute()=0;

Это сделает ваш класс абстрактным, что похоже на то, что вы намереваетесь, поскольку execute не определено.

Если вы когда-нибудь захотите использовать инструкцию в более чем одном файле .cpp, вам следует перенести реализацию методов класса в файл classes.cpp.

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

Как уже говорили, проблема в том, что execute () не реализован. Реализуйте его или сделайте его чисто виртуальным, как говорит Дэн Хук.

Просто дополнительное замечание: во многих (может быть, в большинстве случаев в зависимости от того, что вы кодируете) случаях вам не нужно реализовывать деструктор. Вам просто нужно, если вам нужна определенная функциональность (например, сброс данных в файл).

Пока у вас нет указателя (как в вашем коде), у вас не будет проблем с отслеживанием памяти. Просто удалите деструкторы: это безопасно и меньше кода. Однако, если только один элемент является указателем, все становится беспорядочным, и вам приходится иметь дело с проблемами управления памятью, утечками памяти и ошибками в работе;)

...