簡體   English   中英

將函數指針傳遞給構造函數C ++

[英]Passing a function pointer into a constructor 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;
};

謝謝

我看不到代碼中的函數指針有任何混亂,因此我將嘗試從問題中總結出最佳答案。

似乎不想將指針指向類之外的方法

我的心理調試能力使您感覺到您正在嘗試創建指向類方法的指針。 如果是這樣,則您沒有普通的函數指針,而是有成員函數指針。 成員函數指針具有其自己的特殊語法,因為成員函數被設計為在this參數的上下文中運行, this參數是該函數的隱式部分。

聽起來,您想要做的事情可以通過策略模式更好地完成,或者通過將要執行的不同操作變成普通函數,而不是成員函數來更好地實現。 C ++不需要將所有內容都包含在一個類中,並且實際上沒有任何理由將所有內容都包含在一個類中;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM