34

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

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);
}
4

4 回答 4

48

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

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

(box->*h)(xPos, yPos, width, height);
于 2013-02-11T14:33:49.753 回答
13

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

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

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

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

另一方面,迭代指向成员本身的指针没有这个问题:

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

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

于 2013-02-11T14:59:56.593 回答
10

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

typedef 指向成员函数的指针,如下所示:

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

像这样声明一个:

fn functionPtr = &MyClass::MyFunction

像这样称呼它:

(MyObject.*functionPtr)( argument );
于 2013-02-11T15:00:13.440 回答
1

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

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

 obj.*funcptr(args);

或者

 objptr->*funcptr(args);

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

于 2013-02-11T15:20:04.790 回答