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

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)

  • @JC 那行不通。您需要两者:一个充当“this”的对象,以及一个指向非静态成员函数的指针。 (2认同)

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,但指向成员语法的指针已经足够特殊了.)


Gri*_*ner 8

从我的"获奖";-)关于代表的答案(可在/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)