2010-12-03 17 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つ追加してください適切にアップ。 –

+1

コードを正しくインデントしてください。誰もがこのように見えるコードを読んでくれる可能性は低いです(いいえ、私は各行の4つの余分なスペースについて話していません)。 – jwueller

+0

申し訳ありませんが、サインアップして、何とか私の書式設定がどうにかして失敗しました – iaremonkey

答えて

1

私はコード内に関数ポインタがついているのを見ていないので、私は質問から得られるものから最大限に答えようとします。

私の精神的なデバッグ権限を使用すると、クラスメソッドへのポインタを作成しようとしていることを感知

クラス外メソッドへのポインタを取るしたくないようです。そうであれば、プレーン関数ポインタを持たず、メンバ関数ポインタを持っています。メンバー関数ポインタは、その関数の暗黙的な部分であるパラメーターのコンテキストで実行するように設計されているため、独自の特別な構文があります。

戦略パターンでよりうまくやりたいと思うように聞こえるかもしれませんし、メンバー機能ではなくプレーンな機能にしたいと思っていることを他のものにすることもできます。 C++はすべてをクラスに入れる必要はなく、実際にはすべてがクラスに含まれるようにプログラムする理由はありません)

+0

さらに、関数オブジェクトは、(関数ポインタの代わりに)解決しようとしている問題のより良い解決策になりそうです。 –

+0

@ザック:もし彼がテンプレートやその種のものを書いていたら、私は同意するでしょう。しかし、彼はテンプレートを使って作業していないため、ファンクションを難しくしています。 –

関連する問題