首页 > 解决方案 > 如何正确传递成员函数作为参数

问题描述

如何正确传递成员函数作为参数?

我的代码:

#include <iostream>

using namespace std;

class Test
{
public:
    int add(int a, int b)
    {
        return a + b;
    }
    int sub(int a, int b)
    {
        return a - b;
    }
    typedef int (*funcPtr)(int a, int b);
    int myFunc(funcPtr func, int a, int b)
    {
        return func(a, b);
    }
    void setup()
    {
        cout << myFunc(&Test::add, 5, 3) << endl;
        cout << myFunc(&Test::sub, 5, 3) << endl;
    }
};

int main()
{
    Test test;
    test.setup();
}

结果:

错误:无法使用'int (Test:: )(int, int)'类型的右值初始化 'Test::funcPtr' 类型的参数(又名 'int ( )(int, int)')

预期结果:

8
2

标签: c++

解决方案


您的方法应该是“常规”功能。添加static到它们以允许将它们与函数指针一起使用:

class Test
{
public:
    static int add(int a, int b)
    {
        return a + b;
    }
    static int sub(int a, int b)
    {
        return a - b;
    }
// ...
};

如果你真的指向方法,你应该替换int (*funcPtr)(int a, int b)int (Test::*funcPtr)(int a, int b)使用类似的东西:

class Test
{
public:
    int add(int a, int b)
    {
        return a + b;
    }
    int sub(int a, int b)
    {
        return a - b;
    }
    typedef int (Test::*funcPtr)(int a, int b);
    int myFunc(funcPtr func, int a, int b)
    {
        return (this->*func)(a, b);
    }
    void setup()
    {
        cout << myFunc(&Test::add, 5, 3) << endl;
        cout << myFunc(&Test::sub, 5, 3) << endl;
    }
};

推荐阅读