gpt4 book ai didi

C++在构造函数中调用虚方法

转载 作者:太空狗 更新时间:2023-10-29 23:51:32 24 4
gpt4 key购买 nike

我使用了一个有一些虚方法的父类。当我在构造函数中调用虚拟方法时,它会给出 LNK2019LNK1120 错误,其中包含“error LNK2019: unresolved external symbol”protected: virtual int ... referenced在函数“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
}

父类的父类(没有报错)

#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

最佳答案

shoudn't I call a virtual method in the constructor?

这样做会调用正在构造的类中的重写,不一定是最终的重写。这可能不是您想要的,如果该函数在当前类中是纯虚拟的,则会出错,因此通常您不应该这样做。

在这种情况下,错误表明它是纯虚拟的,并没有在这个类中实现,所以调用它肯定是一个错误。幸运的是,它给了你一个相当友好的链接器错误,而不是未定义的运行时行为。 (更新:您发布的代码证实了这个猜测 - 您不能从构造函数调用该函数)。

Is there way to solve this problem

许多问题可以通过额外的间接级别来解决。我会在一个单独的委托(delegate)类而不是子类中实现启发式:

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
};

在我们开始构建 Search 类之前,委托(delegate)已完全构建,因此从构造函数访问它没有问题。

或者,为了避免不必要的运行时多态性,我可以将委托(delegate)类型作为模板参数注入(inject):

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
};

关于C++在构造函数中调用虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com