传递方法成员的函数指针

时间:2014-05-09 05:17:33

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

好的,这里是显示问题的伪代码。我想将Man的sayAh()方法传递给Dog实例。

class Man
{
public:
    void haveDogBiteYou(){
        Dog *mydog = new Dog();
        myDog->setCallback(&this->sayAh); // How???
        myDog->bite();
    }

    void sayAh(){
        cout << "AHHHHHH!";
    }
}



class Dog{
public:

    void (*callbackFunc)(void);

    void setCallback(void (*callbackFunc)(void)){
        this->callbackFunc=callbackFunc;
    }

    void bite(){
        callbackFunc();
    }

}

我希望以一种方式设置代码,如果我有另一个类像Kid(即Man的子类),我可以将回调传递给该函数的方法成员好。所以可能正在改变

void (*callbackFunc)(void);

void (Man::*callbackFunc)(void);

不会解决这个问题......顺便说一句,我对其他解决方案持开放态度......像Java这样的界面效果很好。

2 个答案:

答案 0 :(得分:1)

检查http://ideone.com/wjRwi4(并在下面复制)

但您可能需要检查一下您的工作方式:

  • 决定是使用函数指针(或静态成员指针)还是方法指针(然后需要一个对象来运行该方法)。
  • 您可能需要考虑如何将其应用于层次结构。
  • 或者,您可以尝试函数对象(即定义了operator()的类/结构)。
  • 请记住,如果为函数/方法指针创建typedef,则总是更容易。
  • 检查http://www.parashift.com/c++-faq/pointers-to-members.html

代码:

#include <iostream>
using namespace std;

class Man;

class Dog{
public:

    Man *man;
    void (Man::*callbackFunc)(void);

    void setCallback(Man *_man,void (Man::*_callbackFunc)(void)){
        callbackFunc=_callbackFunc;
        man=_man;
    }

    void bite();

};

class Man
{
public:
    void haveDogBiteYou(){
        Dog *myDog = new Dog();
        myDog->setCallback(this,&Man::sayAh); // How???
        myDog->bite();
    }

    void sayAh(){
        cout << "AHHHHHH!";
    }
};


void Dog::bite(){
    (man->*callbackFunc)();
}



int main() {
    Man m;
    m.haveDogBiteYou();
    return 0;
}

答案 1 :(得分:0)

您可以更改:

void sayAh(){
    cout << "AHHHHHH!";
}

根据您的需要使用静态成员函数。

static void sayAh(){
    cout << "AHHHHHH!";
}

如果你这样做,你可以简化

    myDog->setCallback(this->sayAh);

    myDog->setCallback(sayAh);