我有一个指向成员函数的指针列表,但是我很难尝试调用这些函数......是否有正确的语法?
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);
}
答案 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);
在你给出的例子中,听起来你真正需要的是虚函数。您需要在许多不同类型的对象上调用标准操作(检测是否与对象相交的对象),在编译时无法识别其类型。这是一项针对虚拟功能的工作。