试图调用成员函数指针将不起作用

时间:2018-01-29 03:45:49

标签: c++ function class pointers

我知道成员函数指针有点棘手,如果函数指针不是类本身的成员,我可以调用它,但如果它是类的成员,似乎无法做到:

struct Window
{
    virtual void handleEvent() {};
    void (Window::*pHandleEvent)();
};

int main()
{
    Window w;
    void (Window::*fnptr)() = &Window::handleEvent;
    (w.*fnptr)(); // Works fine calling a local func ptr
    w.pHandleEvent(); // Calling its own member pointer doesn't work
    // Err: Expression preceding parentheses of apparent call must have
    // (pointer-to) function type
    (w.*pHandleEvent)();    // Doesn't work
    //Err: identifier "pHandleEvent" is undefined
    (w.*Window::pHandleEvent)();    // Doesn't work.
    // Err: A non-static member reference must be relative to a specific object.
}

2 个答案:

答案 0 :(得分:4)

您需要指定两个Window对象:使用其指针的对象和调用该方法的对象。如果它们是相同的,那就是

(w.*w.pHandleEvent)();

请注意优先顺序:如果您改为A Window::*ptm;并希望成为A对象的成员,则为(w.*ptm).a_member

答案 1 :(得分:1)

使用C ++ 17,您可以依靠std::invoke获取指向成员需求的所有指针:

std::invoke(w.pHandleEvent, w);

第一个参数是指向成员的指针,第二个参数是对象或指向它的指针。所有的语法业务都会为你照顾。