“删除”关键字的问题

时间:2011-05-30 22:47:08

标签: c++ memory-management

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是基类
fantasyReaderhorrorReadermysteryReaderscienceReader是派生类。

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 个答案:

答案 0 :(得分:3)

这不是编译时错误,而是链接错误。您已声明Reader的析构函数,但未实现它。您必须在Reader中实现析构函数,即使它是纯虚拟的,如下所示:

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

Reader::~Reader() {}

还要记住(如果你还没有这样做)基类必须总是将析构函数设置为virtual

答案 1 :(得分:2)

这是一个链接错误,而不是编译器错误。

您忘了为Reader的析构函数定义一个实现。

答案 2 :(得分:1)

Reader基类需要有一个公共虚拟析构函数。可能还有其他问题,但这是我可以从发布的不完整代码中收集到的。

答案 3 :(得分:0)

删除语句不重要。您是否将派生类定义为虚拟类?或者,至少你已经将析构函数声明为虚拟?