代码
class cat{
public:
void walk(){
printf("cat is walking \n");
}
void myAbc(){
void (*pKoo)();
pKoo = &this->walk;
}
void myDef(){
void(cat::*pFoo)();
pFoo = &this->walk;
}
}
};
结果
- void (*pKoo)(); - 没问题
- pKoo = &this->walk; - 编译错误
- void(cat::*pFoo)(); - 没问题
- pFoo = &this->walk; - 编译错误;
问题
- 为什么没有 2 个不可能?如果不可能,那1号有什么用?
- 为什么没有 4 个不可能?如果不可能,那 3 号有什么用?
请帮忙解释概念。谢谢
最佳答案
Why no 2 impossible?
我的编译器给出错误信息:
cannot convert ‘void (cat::*)()’ to ‘void (*)()’ in assignment
这意味着您不能将指向成员函数的指针转换为指向函数的指针。它们是不兼容的类型;指向函数的指针可以直接调用,而指向成员函数的指针需要应用于对象。因此,您分配给的类型必须是指向成员函数的指针,或 void (cat::*)();
,正如您在 3 中正确使用的那样。
If Impossible, Then what is the use of No 1?
它用于存储指向静态或非成员函数的指针。
Why no 3 impossible?
(我假设你的意思是 4,而不是 3。)我的编译器给出了一条错误消息:
ISO C++ forbids taking the address of a bound member function to form a
pointer to member function. Say ‘&cat::walk’
出于某种原因,不允许使用对象(或指针)获取成员函数的地址;您必须改用类名。我们只能推测为什么不允许这样做;可能是因为不完全清楚应该选择哪个覆盖(如果它是虚拟的),或者可能出于其他原因。
无论出于何种原因,请使用允许的语法:pFoo = &cat::walk;
关于c++ - 是否有可能 'member function pointer' 指向同一类中的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175194/