为什么我不能用这个其他类的函数填充这个类的函数指针

时间:2012-01-27 14:51:20

标签: c++ class pointers function-pointers

现在一个类的函数指针到另一个类的函数怎么样?这是我的问题

示例:

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"
}

那不行。那是为什么?

4 个答案:

答案 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);

签名不匹配。