我正在尝试为我的程序创建一个决策树,其中每个节点具有相似的分支功能,但分支方法的主体不同。我已经弄清楚了如何将函数指针添加到方法中,但现在似乎不想将指向方法的指针带到类之外。
这是我的节点类
class FighterDecisionTreeNode :
public IDecisionTreeNode
{
private:
FighterDecisionTreeNode* posChild;
FighterDecisionTreeNode* negChild;
DecisionFunction *decisionFunc;
public:
FighterDecisionTreeNode(DecisionFunction *decisionFunction);
~FighterDecisionTreeNode(void);
FighterDecisionTreeNode* getChild(bool child);
bool getBranch(SpaceObject* object, SpaceObject* thisShip);
IDecisionTreeNode* makeDecision(SpaceObject* object, SpaceObject* thisShip);
};
FighterDecisionTreeNode::FighterDecisionTreeNode(DecisionFunction * decisionFunction)
{
decisionFunc = decisionFunction;
}
FighterDecisionTreeNode::~FighterDecisionTreeNode(void)
{
}
FighterDecisionTreeNode* FighterDecisionTreeNode::getChild(bool child)
{
if(child)
{
return posChild;
}
else
{
return negChild;
}
}
IDecisionTreeNode* FighterDecisionTreeNode::makeDecision(SpaceObject* object, SpaceObject* thisShip)
{
return getChild(getBranch(object, thisShip))->makeDecision(object,thisShip);
}
bool FighterDecisionTreeNode::getBranch(SpaceObject* object, SpaceObject* thisShip)
{
return decisionFunc(object, thisShip);
}
这是我的树班
class FighterDecisionTree:
public IDecisionTree
{
private:
//decision methods
bool isEnemy(SpaceObject* enemy, SpaceObject* ship);
//decision nodes
FighterDecisionTreeNode * isEnemyNode;
public:
FighterDecisionTree(void);
virtual ~FighterDecisionTree(void);
bool getBranch(SpaceObject* object);
virtual IDecisionTreeNode* makeDecision();
};
FighterDecisionTree::FighterDecisionTree(void)
{
isEnemyNode = new FighterDecisionTreeNode( &isEnemy );
}
FighterDecisionTree::~FighterDecisionTree(void)
{
}
IDecisionTreeNode* FighterDecisionTree::makeDecision(){
return NULL;
}
bool FighterDecisionTree::getBranch(SpaceObject* object)
{
return false;
}
// I need to pass a condition to each seperate node,
//but each must have a seperate condition
bool FighterDecisionTree::isEnemy(SpaceObject* enemy, SpaceObject* ship)
{
return true;
}
这是节点类正在使用的接口
class IDecisionTreeNode
{
private:
//This is for creating the BST
//IDecisionTreeNode* posChild;
//IDecisionTreeNode* negChild;
public:
typedef bool (DecisionFunction)(SpaceObject* enemy, SpaceObject* ship);
IDecisionTreeNode(void);
IDecisionTreeNode(DecisionFunction *decisionFunction);
~IDecisionTreeNode(void);
virtual IDecisionTreeNode* makeDecision(SpaceObject* object, SpaceObject* thisShip)=0;
};
谢谢
最佳答案
我看不到代码中的函数指针有任何混乱,因此我将尝试从问题中总结出最佳答案。
似乎不想将指针指向类之外的方法
我灵敏的调试能力使您感觉到您正在尝试创建指向类方法的指针。如果是这样,则您没有普通的函数指针,而是有成员函数指针。成员函数指针具有其自己的特殊语法,因为成员函数被设计为在this
参数的上下文中运行,该参数是该函数的隐式部分。
听起来,您想要做的事情可以通过策略模式更好地完成,或者通过将要执行的不同操作变成简单函数,而不是成员函数来更好地实现。 C ++不需要将所有内容都包含在一个类中,并且实际上没有任何理由将所有内容都包含在一个类中;)
关于c++ - 将函数指针传递给构造函数C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4350327/