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

Trying to call a member function pointer won't work

本文关键字:指针 不起作用 函数 成员 调用      更新时间:2023-10-16

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

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.
}
您需要

指定两个Window对象:一个是其指针使用的对象,另一个是调用方法的对象。 如果它们是相同的,那就是

(w.*w.pHandleEvent)();

请注意优先级:如果您相反地具有A Window::*ptm;并且想要A对象的成员,则它是(w.*ptm).a_member

使用 C++17,您可以依靠 std::invoke 来满足所有指向会员需求的指针:

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

第一个参数是指向成员的指针,第二个参数是对象或指向对象的指针。所有的语法业务都为您处理。