类成员函数指针作为类成员

Class member function pointer as a class member

本文关键字:成员 函数 指针      更新时间:2023-10-16
// class
class MyClass
{
public:
void doIt() const
{
    cout << "It works!" << endl;
}
void(MyClass::*fPtr)() const;
};
// main
MyClass *t = new MyClass;
// store function address
t->fPtr = &MyClass::doIt;
(*(t->fPtr))(); // Whats wrong with this line?

我怎么能调用函数存储在fPtr?当我尝试(*(t->fPtr))();编译器给这些错误:

错误C2171: '*':操作数类型'void (__thiscall MyClass::*)(void) const

错误C2064: term不计算为0个参数的函数

(*(t->fPtr))();是错误的,三个正确的语法是((object)->*(ptrToMember))

(t->*(t->fPtr))();

更多背景信息在这里:http://www.parashift.com/c++-faq-lite/pointers-to-members.html(但最好忽略该页中的这些宏…)

main()函数作用域中不存在名为fPtr的变量。您需要使用->操作符引用成员变量,然后使用->*解引用指向成员的指针:

// main
MyClass *t = new MyClass;
// store function adress
t->fPtr = &MyClass::doIt;   
(t->*(t->fPtr))();

或者,您可以创建一个局部变量并将指向成员的指针赋值给它:

// main
MyClass *t = new MyClass;
// store function adress
t->fPtr = &MyClass::doIt;
void (MyClass::*fp)() const = t->fPtr;
(t->*fp)();

后者清楚地说明了为什么需要上面这个奇怪的结构。还可以在不同的对象上执行方法,而不是使用指针到成员类型的成员变量:

MyClass *s = new MyClass;
MyClass *t = new MyClass;
s->fPtr = &MyClass::f;
t->fPtr = &MyClass::g;
(t->*(s->fPtr))(); // Call f() on object *t
(s->*(t->fPtr))(); // Call g() on object *s

->左边的对象告诉编译器从哪个对象读取成员指针,而->*左边的对象告诉编译器在哪个对象上调用成员函数