现在一个类的函数指针到另一个类的函数怎么样?这是我的问题
示例:
class Apple
{
int(Apple::*pActionFunc)(void);
};
class Tree
{
Apple* tempy;
void Init( void );
int I_Work( void );
};
void Tree::Init( void )
{
tempy = new Apple( );
tempy->pActionFunc = &Tree::I_Work;
}
int Tree::I_Work( void )
{
"Do Things"
}
那不行。那是为什么?
答案 0 :(得分:5)
这不起作用,因为像所有变量一样,函数指针也有一个类型,你只能使用指向同一类型的指针来存储变量类型的地址。
int(Apple::*pActionFunc)(void);
告诉编译器pActionFunc
是指向Apple
类的成员函数的指针,该函数将void
作为参数并返回int
。
tempy->pActionFunc = &Tree::I_Work;
尝试存储函数I_Work()
的地址,该函数是Tree
类的成员,其中void
作为输入参数并返回int
。
如果您发现它们是不同类的成员函数,那么就是错误。
答案 1 :(得分:1)
void foo(int);
void (*pfunc)(double);
pfunc = foo; // This is an error
为什么会出错?因为pfunc采用与foo不同的参数。这就像在这里发生的那样。可能看起来Tree::I_Work
是一个不带参数并返回int的函数,因此它应该与Apple的函数兼容,它不带参数并返回int。但事实并非如此。你不能这样打电话给I_Work:
x = I_Work();
你能吗?不。您需要一个Tree对象。
a_tree.I_Work();
这应该提示你,成员函数与自由函数根本不同。成员函数具有隐藏参数。实际上,它根本不是隐藏的,只是在不同的位置。它位于函数名称的左侧,而不是括号中。
因此,总而言之,您不能将一个类的成员函数指针指定给另一个类的成员函数,因为它们不会使用相同的参数,即使它们看起来也是如此。
答案 2 :(得分:0)
除了Als所说的,你不能指定以下内容:
tempy->pActionFunc = &Tree::I_Work;
由于I_Work
有一个隐含的this
指针作为参数,因此参数列表不一样。
答案 3 :(得分:0)
每个成员函数都有一个不可见的this
参数,该参数是函数签名的一部分。当你写:
int(Apple::*pActionFunc)(void);
编译器在内部将其视为:
int(*pActionFunc)(Apple* this);
您尝试插入指针的函数具有以下签名等效项:
int I_Work(Tree* this);
签名不匹配。