C++ 类成员函数指针作为类成员 //类 类MyClass { 公众: void doIt()常量 { 这条线怎么了?
如何调用存储在fPtr中的函数?当我尝试(*(t->fPtr))(),编译器给出 这些错误: 错误C2171:“*”:对“void”(\u thiscall MyClass::*)(void)const类型的操作数无效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 {
错误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))();