C++ 类成员函数指针作为类成员 //类 类MyClass { 公众: void doIt()常量 { 这条线怎么了?

C++ 类成员函数指针作为类成员 //类 类MyClass { 公众: void doIt()常量 { 这条线怎么了?,c++,member-function-pointers,C++,Member Function Pointers,如何调用存储在fPtr中的函数?当我尝试(*(t->fPtr))(),编译器给出 这些错误: 错误C2171:“*”:对“void”(\u thiscall MyClass::*)(void)const类型的操作数无效 错误C2064:term不计算为具有0个参数的函数在main()函数的作用域中没有名为fPtr的变量。您需要使用->运算符引用成员变量,然后使用->*取消引用指向成员的指针: // class class MyClass { public: void doIt() const {

如何调用存储在fPtr中的函数?当我尝试(*(t->fPtr))(),编译器给出 这些错误:

错误C2171:“*”:对“void”(\u thiscall MyClass::*)(void)const类型的操作数无效


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

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

// 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?
或者,您可以创建一个局部变量,并将指针指定给该变量的成员:

// 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)();
->
左侧的对象告诉编译器从哪个对象读取指向成员的指针,而
->*
左侧的对象告诉编译器在哪个对象上调用成员函数。

(*(t->fPtr))();
错误,右侧语法是
((object)->*(ptrtomber))

意味着

更多背景信息请点击此处:
(但最好忽略该页面中的这些宏。)

(t->*(t->fPtr))()
我认为应该work@KoKuToru:这也是错误的。@KoKuToru:你能把你的评论作为回答吗?
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
(t->*(t->fPtr))();