关于c ++:将成员函数指针传递给父类

Pass Member Function Pointers to parent class

我正在研究C++中的PACMN游戏,但是已经遇到了一个成员函数指针的问题。我有两个阶级,分别是pacmanghost,都是从Mouvement继承来的。在子类中,我需要将一个函数传递给Mouvement中的一个函数。但是,我不能简单地拥有静态函数,因为那时我需要静态变量,而静态变量不起作用。

我尝试传递&this->movingUp,它引发错误"无法创建指向成员函数的非常量指针"。

我尝试传递&::movingUp,它引发错误"无法用类型为‘void(:)(int)’的右值初始化‘void()(int)’类型的参数。"

以下是相关的内容:(我删掉了大部分内容,这样你只会看到这个问题需要什么)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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类,它们在这一点上非常相似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);}
    }

};


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

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

在C++中将成员函数传递为参数

如果您真的需要从ghostpacman提供功能,您需要重新考虑您的策略。也许用虚拟函数代替。


为什么不在cMouvement中创建一个虚拟函数,让checkIntersection调用这个虚拟函数呢?