在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
声明?
答案 0 :(得分:3)
这不是编译时错误,而是链接错误。您已声明Reader
的析构函数,但未实现它。您必须在Reader
中实现析构函数,即使它是纯虚拟的,如下所示:
class Reader {
public:
virtual ~Reader() = 0;
};
Reader::~Reader() {}
还要记住(如果你还没有这样做)基类必须总是将析构函数设置为virtual
。
答案 1 :(得分:2)
这是一个链接错误,而不是编译器错误。
您忘了为Reader
的析构函数定义一个实现。
答案 2 :(得分:1)
Reader
基类需要有一个公共虚拟析构函数。可能还有其他问题,但这是我可以从发布的不完整代码中收集到的。
答案 3 :(得分:0)
删除语句不重要。您是否将派生类定义为虚拟类?或者,至少你已经将析构函数声明为虚拟?