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

时间:2011-12-21 19:33:37

标签: c++ member-function-pointers

// 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参数的函数

2 个答案:

答案 0 :(得分:2)

fPtr函数的范围内没有名为main()的变量。您需要使用->运算符引用成员变量,然后使用->*取消引用指向成员的指针:

// 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

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

答案 1 :(得分:2)

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

装置

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

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