如何在基类中存储和执行派生类成员函数

时间:2014-09-27 04:49:47

标签: c++ boost member-function-pointers member-functions

所以我试图在我的程序中为我的一些自动化实体创建一个基本的状态机系统。

这个想法是,自动化实体将简单地调用当前状态或当前分配给它的行为。每个州将被分配到1个功能。

我的成员函数指针存在不兼容问题。很明显,不可能简单地调用一个"派生成员函数指针",好像它是一个"基本成员函数指针"。

我相信我需要能够存储某种类型的"泛型类成员函数指针"。我一直在阅读很多其他帖子,他们正在谈论使用boost :: bind和boost:function作为选项。虽然我不太确定如何在我的代码上下文中使用它:

#include "stdafx.h"
#include <iostream>

using namespace std;

class Automated
{
public:

    typedef void (Automated::*behaviourFunc)();

    void SetBehaviour(behaviourFunc newBehavFunc)
    {
        currentFunction = newBehavFunc;
    }

private:

    behaviourFunc currentFunction;

protected:

    void executeCurrentBehaviour()
    {
        (this->*currentFunction)();
    }
};

class Animal : public Automated
{
public:

    void update()
    {
        executeCurrentBehaviour();
    }
};

class Cat : public Animal
{
    int fishCount;

    void CatchFish()
    { 
        fishCount++;
    }

    void eatFish()
    { 
        fishCount--;
    }
};

class Dog : public Animal
{
    int boneCount;

    void FindBone()
    {
        boneCount++;
    }

    void throwBone()
    {
        boneCount--;
    }

public:

    Dog()
    {
        SetBehaviour(FindBone); //Error: argument of type "void (Dog::*)()" is incompatible with parameter of type "Automated::behaviourFunc"
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    Dog jake;
    Cat nemo;

    nemo.SetBehaviour(Cat::CatchFish);  //Error function "Cat::CatchFish" is inaccessible

    jake.update();
    nemo.update();

    return 0;
}

由于我的自动化实体将具有未知数量的状态,因此具有未知数量的功能,因此无法创建通用虚拟方法。

存储和执行基类的成员函数的最佳方法是什么?

或者,什么是存储泛型成员类函数的方法,并调用它?

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以是的,boost :: function和boost :: bind几乎就是我想要的。

我可以在Class&#34; Automated&#34;中存储boost :: function。

#include <boost/function.hpp>

class Automated
{
    //ideally there should use a function to set the "currentFunction" but
    //for learning purposes just make it public
    public:

        //function returns void, and no paramters
        boost::function<void()> currentFunction;

        //etc
 }

简单地在派生类中调用boost :: bind

#include <boost/bind.hpp>

class Cat : public Animal
{
    int fishCount;

    void CatchFish()
    { 
        fishCount++;
    }

    void eatFish()
    { 
        fishCount--;
    }

    Cat()
    {
        //This bind specifies a void return and no paramters just like the 
        //the signature for the "currentFunction"
        currentFunction = boost::bind(&HF_BattleEnemyBat::CatchFish, this)

       //You can simply call "currentFunction" like this:
       currentFunction();
    }
};

我发现以下链接非常有用。直截了当,在我看来比提升文档本身更清晰:

http://www.radmangames.com/programming/how-to-use-boost-function

http://www.radmangames.com/programming/how-to-use-boost-bind

这些链接还详细介绍了如何使用带参数和不同返回类型的函数。