我有一个指针的成员函数的列表,但我有困难的时候试图调用这些函数...什么正确的语法?
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);
}
指向非静态成员是一个独特的动物与独特的语法。
这些功能需要被提供的this
指针,所以你必须有Box
指针方便的将被用作this
。
(box->*h)(xPos, yPos, width, height);
通过一个指向成员函数调用的成员函数具有特定的语法:
(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
,但成员指针语法已经够特别。)
从我的“获奖” ;-)有关委托答案(可在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 );
你试图通过一个对象来获取一个成员函数指针背叛一种误解。 成员函数指针不包含一个指向你给他们打电话的对象。 你必须在调用点提供了这样一个指针。
正如许多人所指出的,对于一个成员函数调用的语法可以是:
obj.*funcptr(args);
要么
objptr->*funcptr(args);
在你给的例子,这听起来像你真正需要的是一个虚拟函数。 使用的是标准操作(检测阉羊或不是对象与盒相交),需要在许多不同类型的对象,其中所述类型的不能在编译时已知被调用。 这是削减了虚函数的工作。