【问题标题】:C++ Call Pointer To Member Function指向成员函数的 C++ 调用指针
【发布时间】:2013-01-26 16:10:14
【问题描述】:

我有一个指向成员函数的指针列表,但我很难尝试调用这些函数...正确的语法是什么?

typedef void (Box::*HitTest) (int x, int y, int w, int h);

for (std::list<HitTest>::const_iterator i = hitTestList.begin(); i != hitTestList.end(); ++i)
{
    HitTest h = *i;
    (*h)(xPos, yPos, width, height);
}

我也在尝试在这里添加成员函数

std::list<HitTest> list;

for (std::list<Box*>::const_iterator i = boxList.begin(); i != boxList.end(); ++i)
{
    Box * box = *i;
    list.push_back(&box->HitTest);
}

【问题讨论】:

  • 定义“遇到困难”
  • 它不工作大声笑,我不能让它工作
  • 您确定要这样做,而不是使用 Box 元素列表和虚函数吗?
  • 第一个代码我收到错误“错误 C2276:'&':对绑定成员函数表达式的非法操作”对于第二个代码片段,我收到语法错误“错误:表达式必须有一个指针类型”使用该语法”

标签: c++ function-pointers


【解决方案1】:

指向非静态成员函数的指针是具有独特调用语法的独特野兽。

调用这些函数不仅需要提供命名参数,还需要提供this 指针,因此您必须准备好用作thisBox 指针。

(box->*h)(xPos, yPos, width, height);

【讨论】:

  • 我收到错误“错误:表达式必须具有指针类型”的语法。
  • @JC。在这里,试试这个:parashift.com/c++-faq/macro-for-ptr-to-memfn.html
  • 类似((*this).*h)(xPos, yPos, width, height) 但我更喜欢远离
  • 问题是我正在遍历成员函数指针列表并在另一个对象中调用每个函数,而不是拥有该方法的类型。在我调用成员函数指针的地方我没有具有我正在调用的成员函数的对象的实例
  • @JC 那行不通。您需要两个:一个充当this 的对象,以及一个指向非静态成员函数的指针。
【解决方案2】:

通过指向成员函数的指针调用成员函数 有一个特定的语法:

(obj.*pmf)( params );   //  Through an object or reference.
(ptr->*pmf)( params );  //  Through a pointer.

虽然-&gt;* 可以被覆盖,但它不在标准中 库迭代器(可能是因为它需要覆盖 对于每个可能的函数类型)。所以如果你只有一个 迭代器,你必须取消引用它并使用第一种形式:

((*iter).*pmf)( params );

另一方面,遍历指向成员的指针 自己没有这个问题:

(objBox.*(*i))( params );   //  If objBox is an object
(ptrBox->*(*i))( params );  //  If ptrBox is a pointer

(我认为您不需要 *i 周围的括号,但是 指向成员语法的指针已经够特殊了。)

【讨论】:

    【解决方案3】:

    来自我的“获奖”;-) 关于代表的回答(可在https://stackoverflow.com/questions/9568150/what-is-a-c-delegate/9568226#9568226 获得):

    Typedef 指向成员函数的指针如下:

    typedef void (T::*fn)( int anArg );
    

    这样声明:

    fn functionPtr = &MyClass::MyFunction
    

    这样称呼它:

    (MyObject.*functionPtr)( argument );
    

    【讨论】:

      【解决方案4】:

      您尝试通过对象获取成员函数指针暴露了一个误解。成员函数指针不包括指向您调用它们的对象的指针。您必须在调用时提供这样的指针。

      正如许多人所指出的,成员函数调用的语法是:

       obj.*funcptr(args);
      

       objptr->*funcptr(args);
      

      在您给出的示例中,听起来您真正需要的是一个虚函数。您有一个标准操作(检测对象是否与框相交),需要在许多不同类型的对象上调用,这些对象的类型在编译时是未知的。这是一项专门针对虚拟功能的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 2010-12-28
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多