将成员函数指针传递给父类

时间:2013-09-27 20:37:10

标签: c++ pointers inheritance member-function-pointers

我正在使用C ++开发Pacman游戏,但遇到了成员函数指针的问题。我有两个类pacmanghost,它们都继承自Mouvement。在子类中,我需要将函数传递给Mouvement中的函数。但是,我不能简单地使用静态函数,因为我需要静态变量,这是行不通的。

我试过传递&this->movingUp会抛出错误'无法创建指向成员函数的非常量指针'

我尝试传递&<ghost or pacman>::movingUp,它抛出错误“无法初始化类型为'void()(int)'的参数',其值为'void(:: )的rvalue( int)'“

以下是相关内容:(我删除了大部分内容,以便您只看到此问题的必要条件)

class cMouvement {
protected:

    int curDirection = -3; // Variables that are used in the 'movingUp, etc' functions.
    int newDirection = -3; // And therefore can't be static


public:

void checkIntersection(void (*function)(int), bool shouldDebug){

    // Whole bunch of 'If's that call the passed function with different arguments

}

然后是课程pacmanghost,此时非常相似。

class pacman : public cMouvement {

    void movingUp(int type){
        // Blah blah blah
    }

    // movingDown, movingLeft, movingRight... (Removed for the reader's sake)



public:
    /*Constructor function*/

    void move(bool shouldDebug){
        if (curDirection == 0)     {checkIntersection(&movingUp, false);}
        else if (curDirection == 1)     {checkIntersection(&movingRight, false);}
        else if (curDirection == 2)     {checkIntersection(&movingDown, false);}
        else if (curDirection == 3)     {checkIntersection(&movingLeft, false);}
    }

};

2 个答案:

答案 0 :(得分:1)

为什么不在cMouvement中创建虚拟函数并让checkIntersection调用该虚函数

答案 1 :(得分:1)

您想要的是提供成员函数的签名,而不是常规函数。

void checkIntersection(void (ghost::*)(int), bool shouldDebug){

请参阅Passing a member function as an argument in C++

如果您确实需要提供ghost pacman的功能,则需要重新考虑您的策略。也许使用虚拟功能。