Проблемы с ключевым словом "delete" - PullRequest
0 голосов
/ 31 мая 2011

В функции main

string reader_txt = "Readers.txt";
string book_txt = "Books.txt";

Reader * obj[10];

// *********** Reading Reader.txt

ifstream reader_input;
reader_input.open(reader_txt.c_str()); // open file

string reader_name;
string reader_category;
int reader_n_category;
int counter=0;

if(reader_input.is_open())
{
    while( getline(reader_input, reader_name, '\n') && getline(reader_input, reader_category, '\n'))
    {
        reader_n_category = atoi(reader_category.c_str());

        switch(reader_n_category)
        {
        case FANTASY:
            obj[counter++] = new fantasyReader(reader_name);
            break;
        case MYSTERY:
            obj[counter++] = new mysteryReader(reader_name);
            break;
        case HORROR:
            obj[counter++] = new horrorReader(reader_name);
            break;
        case SCIENCE:
            obj[counter++] = new scienceReader(reader_name);
            break;
        }
    }
}
else
    cout<<"Cannot open up the Readers.txt"<<endl;

reader_input.close();   // close file

reader является базовым классом
fantasyReader, horrorReader, mysteryReader, scienceReader являются производными классами.

В конце main я поставил:

for(int pos=0; pos < counter; pos++)
{
     delete obj[pos];  // compiling error, I don't know why
}

Я получаю ошибку компиляции:

main.obj: ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Reader::~Reader(void)" (??1Reader@@QAE@XZ) ссылкав функции "public: void * __thiscall Reader::'scalar deleting destructor'(unsigned int)" (??_GReader@@QAEPAXI@Z)

Это не сработает.Как или где я должен написать заявление delete?

Ответы [ 4 ]

3 голосов
/ 31 мая 2011

Это не ошибка времени компиляции, а ошибка компоновки.Вы объявили деструктор Reader, но не реализовали его.Вы должны реализовать деструктор в Reader, даже если он чисто виртуальный, например:

class Reader {
public:
  virtual ~Reader() = 0;
};

Reader::~Reader() {}

Также помните (если вы этого еще не сделали), что базовый класс должен всегда имеет свой деструктор, установленный как virtual.

2 голосов
/ 31 мая 2011

Это ошибка компоновки, а не ошибка компилятора.

Вы забыли определить реализацию для деструктора Reader.

1 голос
/ 31 мая 2011

Базовый класс Reader должен иметь публичный виртуальный деструктор.Могут быть и другие проблемы, но это то, что я могу почерпнуть из размещенного неполного кода.

0 голосов
/ 31 мая 2011

Важно не утверждение удаления.Вы определили производные классы как виртуальные?Или, по крайней мере, вы объявили деструкторы виртуальными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...