Передача указателя на функцию в конструктор C ++ - PullRequest
0 голосов
/ 04 декабря 2010

Я пытаюсь создать дерево решений для моей программы, в котором каждый узел имеет похожую функцию ветвления, но разные тела в методе ветвления. Я выяснил, как получить указатели на функции в методе, но теперь кажется, что он не хочет брать указатель на метод за пределами класса.

Это мой класс узла

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 Ответ

1 голос
/ 04 декабря 2010

Я не вижу никаких проблем с указателями на функции в вашем коде, поэтому я попытаюсь ответить наилучшим образом из того, что я могу почерпнуть из вопроса.

похоже, что он не хочет брать указатель на метод за пределами класса

Мои психические отладочные способности чувствуют, что вы пытаетесь создать указатели на методы класса . Если это так, у вас нет простого указателя на функцию, у вас есть указатель на функцию-член. Указатели на функции-члены имеют собственный специальный синтаксис, поскольку функция-член предназначена для запуска в контексте параметра this, который является неявной частью этой функции.

Похоже, что то, что вы пытаетесь сделать, будет лучше обслуживаться шаблоном стратегии или превращением различных вещей, которые вы хотите сделать, в простые функции, а не в функции-члены. C ++ не требует, чтобы все было в классе, и на самом деле нет причин программировать, чтобы все было в классе;)

...