ciy*_*iyo 2 c++ virtual-functions lnk2019
我使用具有一些虚方法的父类.当我调用虚拟方法在构造函数中,它提供了LNK2019与LNK1120以"错误error LNK2019: unresolved external symbol "protected: virtual int ... referenced in function "public: __thiscall ..."和" ...\Debug\8puzzleProject.exe : fatal error LNK1120: 1 unresolved externals"的消息.
有没有办法解决这个问题,或者我不是在构造函数中调用虚方法?
谢谢!
这是代码:
有错误的类:
#ifndef HEURISTICSEARCH_H
#define HEURISTICSEARCH_H
#include "BruteSearch.h"
class HeuristicSearch: public BruteSearch
{
public:
HeuristicSearch( int initial[BOARD_LIMIT][BOARD_LIMIT] );
bool search();
protected:
virtual int calculateUtility() = 0;
virtual int calculateUtility( Node* ) = 0;
bool check4Goal();
void checkNmove();
int findMin(int* values );
int utilityCost;
};
#endif
HeuristicSearch::HeuristicSearch( int initial[BOARD_LIMIT][BOARD_LIMIT] )
:BruteSearch( initial )
{
utilityCost = calculateUtility(); //After deleting this line, the error's gone
}
Run Code Online (Sandbox Code Playgroud)
父类的父类(没有错误)
#ifndef BRUTESEARCH_H
#define BRUTESEARCH_H
#include <iostream>
#include <queue>
#include "Constants.h"
#include "Node.h"
class BruteSearch
{
public:
BruteSearch( int initial[BOARD_LIMIT][BOARD_LIMIT] );
virtual bool search(){ return false; }
protected:
bool check4Goal();
void printBoard();
int turn;
int goalBoard[BOARD_LIMIT][BOARD_LIMIT] ;
Node *currentPtr;
};
#endif
Run Code Online (Sandbox Code Playgroud)
我不是在构造函数中调用虚方法吗?
这样做会调用正在构造的类中的覆盖,而不一定是最终覆盖.这可能不是你想要的,如果函数在当前类中是纯虚函数则会出错,所以通常你不应该这样.
在这种情况下,错误表明它在这个类中是纯虚拟的,而不是实现的,所以调用它肯定是一个错误.幸运的是,它为您提供了一个相当友好的链接器错误,而不是未定义的运行时行为.(更新:您发布的代码确认猜测 - 您无法从构造函数中调用该函数).
有没有办法解决这个问题
通过额外的间接级别可以解决许多问题.我会在一个单独的委托类中实现启发式,而不是子类:
struct Heuristic {
virtual ~Heuristic() {} // Don't forget this on a polymorphic base class
virtual int calculateUtility() = 0;
virtual int calculateUtility( Node* ) = 0;
};
class HeuristicSearch: public BruteSearch {
public:
HeuristicSearch(Heuristic & h, int initial[BOARD_LIMIT][BOARD_LIMIT]) :
BruteSearch(initial),
heuristic(h),
utilityCost(heuristic.calculateUtility()) // No problem calling this
{}
private:
Heuristic & heuristic;
int utilityCost;
// and so on
};
Run Code Online (Sandbox Code Playgroud)
在我们开始构造Search类之前完全构造了委托,因此从构造函数访问它没有任何问题.
或者,为了避免不必要的运行时多态性,我可能会将委托类型作为模板参数注入:
template <class Heuristic>
class HeuristicSearch: public BruteSearch {
public:
HeuristicSearch(int initial[BOARD_LIMIT][BOARD_LIMIT]) :
BruteSearch(initial),
utilityCost(heuristic.calculateUtility()) // Doesn't have to be virtual
{}
private:
Heuristic heuristic;
int utilityCost;
// and so on
};
Run Code Online (Sandbox Code Playgroud)