2010-12-03 200 views
0

我正在尝试为我的程序制作一个决策树,其中每个节点都具有类似的分支功能,但在分支方法中具有不同的主体。我已经想出了如何让函数指针进入方法,但现在它似乎不想将指针指向类之外的方法。将函数指针传递给构造函数C++

这是我的节点类

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

谢谢

+1

请在每行代码的开头添加一个额外的4个缩进空格,以便它显示正确地进行。 – 2010-12-03 22:18:34

+1

请正确缩进您的代码。渺茫的是,任何人都愿意阅读这样的代码(不,我不是在谈论每行4个额外空间)。 – jwueller 2010-12-03 22:20:38

回答

1

我没有看到任何弄乱你的代码中的函数指针,所以我会试图从我能从问题中收集到的最好答案。

似乎不想把指针方法的类

我的心理调试权力感觉到你想创建的指针类方法之外。如果是这样,你没有一个简单的函数指针,你有一个成员函数指针。成员函数指针有自己特殊的语法,因为成员函数被设计为在参数this的上下文中运行,该参数是该函数的一个隐含部分。

听起来好像你想要做的事情会更好地服务于策略模式,或者通过将不同的事情变成简单的功能而不是成员函数。 C++并不要求所有东西都在一个类中,并且没有任何理由可以编程以使所有内容都在一个类中;)