C ++呼叫指向成员函数的指针

时间:2013-02-11 14:32:25

标签: c++ function-pointers

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

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 个答案:

答案 0 :(得分:30)

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

这些函数需要提供this指针,因此您必须使用Box指针,这将被用作this

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

答案 1 :(得分:9)

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

(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的括号,而是{。}} 指向成员语法的指针已经非常特殊了。)

答案 2 :(得分:7)

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

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

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

声明一个这样的:

fn functionPtr = &MyClass::MyFunction

这样称呼:

(MyObject.*functionPtr)( argument );

答案 3 :(得分:1)

您尝试通过对象获取成员函数指针会产生误解。成员函数指针不包含指向您调用它们的对象的指针。你必须在通话时提供这样的指针。

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

 obj.*funcptr(args);

 objptr->*funcptr(args);

在你给出的例子中,听起来你真正需要的是虚函数。您需要在许多不同类型的对象上调用标准操作(检测是否与对象相交的对象),在编译时无法识别其类型。这是一项针对虚拟功能的工作。