Thi*_*ngs 24 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);
}
Run Code Online (Sandbox Code Playgroud)
我也试图在这里添加成员函数
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);
}
Run Code Online (Sandbox Code Playgroud)
Dre*_*ann 32
指向非静态成员的指针是具有独特语法的独特野兽.
这些函数需要提供一个this指针,所以你必须有一个Box方便的指针,将用作this.
(box->*h)(xPos, yPos, width, height);
Run Code Online (Sandbox Code Playgroud)
Jam*_*nze 10
通过指向成员函数的指针调用成员函数具有特定的语法:
(obj.*pmf)( params ); // Through an object or reference.
(ptr->*pmf)( params ); // Through a pointer.
Run Code Online (Sandbox Code Playgroud)
虽然->*可以重写,但它不在标准库迭代器中(可能因为它需要覆盖每个可能的函数类型).因此,如果你所拥有的只是一个迭代器,你将不得不取消引用它并使用第一个形式:
((*iter).*pmf)( params );
Run Code Online (Sandbox Code Playgroud)
另一方面,迭代指向成员本身的指针没有这个问题:
(objBox.*(*i))( params ); // If objBox is an object
(ptrBox->*(*i))( params ); // If ptrBox is a pointer
Run Code Online (Sandbox Code Playgroud)
(我认为你不需要围绕它的括号*i,但指向成员语法的指针已经足够特殊了.)
从我的"获奖";-)关于代表的答案(可在/sf/ask/669770531/#9568226获得):
Typedef指向成员函数的指针,如下所示:
typedef void (T::*fn)( int anArg );
Run Code Online (Sandbox Code Playgroud)
声明如下:
fn functionPtr = &MyClass::MyFunction
Run Code Online (Sandbox Code Playgroud)
像这样称呼它:
(MyObject.*functionPtr)( argument );
Run Code Online (Sandbox Code Playgroud)