C ++调用成员函数指针(C++ Call Pointer To Member Function)

2019-07-19 17:32发布

我有一个指针的成员函数的列表,但我有困难的时候试图调用这些函数...什么正确的语法?

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);
}

Answer 1:

指向非静态成员是一个独特的动物与独特的语法。

这些功能需要被提供的this指针,所以你必须有Box指针方便的将被用作this

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


Answer 2:

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

(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 ,但成员指针语法已经够特别。)



Answer 3:

从我的“获奖” ;-)有关委托答案(可在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 );


Answer 4:

你试图通过一个对象来获取一个成员函数指针背叛一种误解。 成员函数指针不包含一个指向你给他们打电话的对象。 你必须在调用点提供了这样一个指针。

正如许多人所指出的,对于一个成员函数调用的语法可以是:

 obj.*funcptr(args);

要么

 objptr->*funcptr(args);

在你给的例子,这听起来像你真正需要的是一个虚拟函数。 使用的是标准操作(检测阉羊或不是对象与盒相交),需要在许多不同类型的对象,其中所述类型的不能在编译时已知被调用。 这是削减了虚函数的工作。



文章来源: C++ Call Pointer To Member Function