C++如何将成员函数指针传递给另一个类?

4

这是我想实现的内容:

class Delegate
{
public:
    void SetFunction(void(*fun)());
private:
    void(*mEventFunction)();
}

然后是名为Test的类。
class Test
{
public:
    Test();
    void OnEventStarted();
}

现在在Test()函数中,我想将OnEventStarted传递给Delegate,代码如下:
Test::Test()
{
    Delegate* testClass = new Delegate();
    testClass->SetFunction(this::OnEventStarted);
}

但是OnEventStarted是一个非静态成员函数,我该怎么办?

Don’t. - crashmstr
2个回答

6
为了调用成员函数,您需要指向成员函数和对象的指针。然而,由于成员函数类型实际上包括包含函数的类(在您的示例中,它将是void (Test:: *mEventFunction)();,并且只适用于Test成员),更好的解决方案是使用std::function。下面是示例代码:
class Delegate {
public:
    void SetFunction(std::function<void ()> fn) { mEventFunction = fn);
private:
    std::function<void ()> fn;
}

Test::Test() {
    Delegate testClass; // No need for dynamic allocation
    testClass->SetFunction(std::bind(&Test::OnEventStarted, this));
}

2
C11中有一个新的std::mem_fn。我认为这更好。 - Keyu Gan

0

你应该传递 &Test::OnEventStarted,这是成员函数指针的正确语法。

之后,你需要获取 Test 类的一个实例来运行该函数,像这样:

instanceOfTest->*mEventFunction()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接