【问题标题】:C++: Function pointer to another class functionC++:指向另一个类函数的函数指针
【发布时间】:2012-01-25 20:47:08
【问题描述】:

我有两节课

class B {
public:
    int func(int i);
};

class A {
public:
    typedef int (B::*fPtr)(int);
    void run();
    B* mB;
};

void A::run() {
    // create a pointer
    fPtr p = &(B::func);
    // invoke the function
    mB->*p(2);     <------- Compilation Error
}

我需要的是在 A 的 run 函数中创建一个指向 func() 的指针。我收到一个编译错误,指出 mB 与具有 1 个参数的函数不对应。

请帮忙

【问题讨论】:

  • 你为什么要搞得这么复杂?为什么你用继承标记它 - 当你不使用它时?你听说过接口吗?
  • 为什么不使用 std::function/boost::function?它们往往比愚蠢的 C 风格函数指针更灵活、更易于使用。
  • @EthanSteinberg 成员函数指针与 C 函数指针几乎没有关系,不能存储在 std/boost::function
  • @BenjaminLindley 将成员函数存储在 std::function 中很简单。这种情况下的示例是std::function&lt;int(B*,int)&gt; fun = &amp;B::func。这样通话就不会那么复杂了fun(mB,2);

标签: c++ function pointers


【解决方案1】:

为什么不能打电话给mB-&gt;func(2);

如果您需要 B 的不同功能,可以查看 virtual 函数和类继承

【讨论】:

  • 鉴于我的项目设计和我想要实现的目标,这就是我想要的解决方案。
【解决方案2】:

您需要在函数表达式周围加上括号:

(mB->*p)(2);

但正如其他人所指出的,几乎可以肯定有更好的方法来做你想做的事情。

【讨论】:

  • 首先,感谢您的帮助。至于使用上面提到的其他东西,我认为这个解决方案是最适合我的情况
【解决方案3】:

类的实例方法总是有一个隐藏的this指针的第一个参数,因此它与你的函数指针typedef不兼容。没有办法直接获得指向成员函数的指针。典型的解决方法是使用“thunk”,在其中传递一个接受通用“catch all”参数(例如void *)的静态函数,该参数可以静态转换为您选择的指针,您可以在该指针上调用成员功能。示例:

class B
{
public:
    static void MyThunk(void * obj)
    {
        static_cast<B *>(obj)->MyRealFunc();
    }

    void MyRealFunc()
    {
        // do something here
    }

    // . . .
};

您可以轻松获得指向静态函数的指针,因为它没有“隐藏的this”,只需使用B::MyThunk 引用它即可。如果您的函数需要额外的参数,您可以使用 functor 之类的东西来捕获必要的参数和状态。

你绝对应该阅读这个 C++ FAQ Lite 页面,它会告诉你更多关于这一切的信息:Pointers to member functions

【讨论】:

  • 好答案。为什么obj的类型一定要void *?我更喜欢B *
  • @bobbymcr:我认为您以前从未使用过-&gt;*.* 运算符?正如 Alex 的示例所示,它们确实允许通过指针调用对象实例上的方法。他只是缺少一组括号才能使他的代码正确编译。
  • @DavidGrayson:通常你必须使用一些“基本”指针类型来与 Win32 上的 CreateThread 之类的东西进行互操作,它只允许你将 LPVOID 传递给你的 ThreadStart 函数指针。你当然应该尽可能地强类型化,但你并不总是有选择的余地。
  • 昨天我不小心对你投了反对票。我打算点击另一个箭头,但显然我没有通过互联网清醒测试。请不要为这对您声誉的毁灭性打击而心烦意乱。不是你……是我……(附注:也许有一天我会发现这个答案已编辑并修复它?我自己找不到任何可以编辑的东西)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多