错误相关文件:
AndQuery.h
#pragma once
#ifndef _ANDQUERY_H_
#define _ANDQUERY_H_
#include"BinaryQuery.h"
using namespace std;
class Query;
class AndQuery : public BinaryQuery
{
friend Query operator&(const Query&, const Query&);
AndQuery(const Query& left, const Query& right) : BinaryQuery(left, right, "&")
{ cout << "AndQuery的构造函数" << endl; }
QueryResult eval(const TextQuery&) const;
};
inline Query operator&(const Query& l, const Query& r)
{
return shared_ptr<Query_base>(new AndQuery(l, r));
}
#endif
第一个错误的原因
main.cpp 忘记包含头文件了。 报错信息:
LNK2019 无法解析的外部符号
"class Query __cdecl operator&(class Query const &,class Query const &)"
(??I@YA?AVQuery@@AEBV0@0@Z),
函数 main 中引用了该符号
报错信息似乎是说:你在main 函数里使用了重载的& 运算符,但是找不到它的定义在哪。 仔细一想,哦,确实是,我忘记包含头文件(AndQuery.h )了,怎么可能找到。 这种低级错误,在大工程里一定要注意,因为涉及到的头文件太多,继承体系也很复杂,很容易出现忘记包含某个头文件的情况。
第二个错误的原因
没有对父类的纯虚函数定义自己的虚函数。 报错信息:
LNK2001 无法解析的外部符号
"private: virtual class QueryResult __cdecl AndQuery::eval(class TextQuery const &)const "
(?eval@AndQuery@@EEBA?AVQueryResult@@AEBVTextQuery@@@Z)
根据报错信息很难推断出是为啥错了,只能知道,是因为AndQuery 的成员函数eval() 出的错。 我们去分析这个成员函数。 这个成员函数是父类定义的纯虚函数,我们之前说过,对于抽象父类声明的纯虚函,子类一定要给出他的实际定义,把它变成自己的虚函数。即使现有的代码根本不会调用到这个虚函数,那也还是要给出定义。 除非你的当前的代码中根本没有用到这个子类,这时,你才可以不给出定义。
|