在C ++中将函数指针传递给成员函数。获取错误

时间:2017-10-29 11:40:51

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

嗨,这是我第一次在C ++中传递函数指针。 所以这是我的代码: -

#include <iostream>
using namespace std;

// Two simple functions
class student
{
public:
void fun1() { printf("Fun1\n"); }
void fun2() { printf("Fun2\n"); }

// A function that receives a simple function
// as parameter and calls the function
void wrapper(void (*fun)())
{
    fun();
}
};

int main()
{   student s;

    s.wrapper(s.fun1());
    s.wrapper(s.fun2());
    return 0;
}

最初在包装函数中我只传递了fun1和fun2.I出错了

try.cpp:22:15: error: ‘fun1’ was not declared in this scope
     s.wrapper(fun1);
               ^~~~
try.cpp:23:15: error: ‘fun2’ was not declared in this scope
     s.wrapper(fun2);

后来我尝试将s.fun1()和s.fun2()作为参数传递,但又一次出错

try.cpp:23:23: error: invalid use of void expression
     s.wrapper(s.fun1());
                       ^
try.cpp:24:23: error: invalid use of void expression
     s.wrapper(s.fun2());

请帮助我不知道该怎么做:(

1 个答案:

答案 0 :(得分:3)

让我们来处理帖子中的两个问题。

  1. 您正在呼叫fun1fun2。由于它们的返回类型为void,因此您无法将结果作为某些值传递。特别是作为函数指针的值。您也无法使用点成员访问运算符获取其地址。这将我们带到以下地方。

  2. 会员功能与常规功能不同。你不能只拿他们的地址。它们的处理是特殊的,因为成员函数只能在对象上被称为 。所以它们有一个特殊的语法,涉及它们所属的类。

  3. 以下是 做出类似事情的方式:

    class student
    {
    public:
        void fun1() { printf("Fun1\n"); }
        void fun2() { printf("Fun2\n"); }
    
        // A function that receives a member function
        // as parameter and calls the function
        void wrapper(void (student::*fun)())
        {
            (this->*fun)();
        }
    };
    
    int main()
    {   student s;
    
        s.wrapper(&student::fun1);
        s.wrapper(&student::fun2);
        return 0;
    }