【问题标题】:Trying to call a member function pointer won't work尝试调用成员函数指针不起作用
【发布时间】:2018-07-07 17:23:31
【问题描述】:

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

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.
}

【问题讨论】:

  • 我宁愿建议您使用std::function 变量和捕获w 的lambda 表达式来完成。
  • @TheDude 是的,std::function 确实很棒,但在这种情况下,我想了解语法错误的地方,或者我是否真的可以这样称呼它。

标签: c++ function class pointers


【解决方案1】:

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

(w.*w.pHandleEvent)();

注意优先级:如果您改为使用A Window::*ptm; 并想要A 对象的成员,则为(w.*ptm).a_member

【讨论】:

  • 谢谢。我以为我正在接近 (w.*Window::pHandleEvent)();
  • @Zebrafish:你可以(w.*&Window::handleEvent)(),甚至(w.*(w.*&Window::pHandleEvent))(),但这显然没有意义。
  • 有时会喜欢 C++ 语法
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2016-08-17
    • 2012-12-16
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多