3
// 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:术语不计算为采用 0 个参数的函数

4

2 回答 2

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

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

于 2011-12-21T19:43:57.520 回答
2

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

方法

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

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

于 2011-12-21T19:46:02.307 回答