调用成员函数指针

4
如何调用指向成员函数的成员函数指针?我正在学习回调,这只是为了学习目的。我该如何调用 m_ptr 函数?
class Test{
   public:
       void (Test::*m_ptr)(void) = nullptr;
       void foo()
       {
           std::cout << "Hello foo" << std::endl;
        }

   };

void (Test::*f_ptr)(void) = nullptr;

int main()
{
     Test t;
     f_ptr = &Test::foo;
     (t.*f_ptr)();     
     t.m_ptr =  &Test::foo;
    //  t.Test::m_ptr();   //Does not work
    //  t.m_ptr();         //Does not work
    //  (t.*m_ptr)();      //Does not work
     return 0;
}

1
在coliru上实时演示 - Scheff's Cat
3个回答

7

你已经接近成功了。请记住,m_ptr本身是一个数据成员,因此为了访问它,你需要告诉编译器解析那个与持有成员指针的实例相关的关系。像这样调用:

 (t.*t.m_ptr)();
 //  ^^ this was missing

4
如果你使用的是C++ 17,你还可以:
std::invoke(t.m_ptr, t);

1
运算符.*要求右侧返回类类型成员指针的表达式,并且左侧为该类型的对象表达式(例如在您的情况下是t)。但您的指针是一个成员,因此正确的表达式应该是t.m_ptr

“Test” 没有成员 “f_ptr”。他们知道如何调用(全局)指向成员的指针,但他们不知道如何引用成员指向成员的指针以调用它。 - Caleth

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