c ++成员函数指针问题

时间:2011-06-07 08:44:05

标签: c++ member-function-pointers

我是c ++的新手。我想知道对象指针和指向成员函数的指针。我写了一段代码:

代码:

#include <iostream>
using namespace std;
class golu
{
   int i;
public:
   void man()
   {
      cout<<"\ntry to learn \n";
   }
};
int main()
{
   golu m, *n;
   void golu:: *t =&golu::man(); //making pointer to member function

   n=&m;//confused is it object pointer
   n->*t();
}

但是当我编译它时,它显示了两个错误:

pcc.cpp: In function ‘int main()’:
pcc.cpp:15: error: cannot declare pointer to ‘void’ member
pcc.cpp:15: error: cannot call member function ‘void golu::man()’ without object
pcc.cpp:18: error: ‘t’ cannot be used as a function.

我的问题如下:

  1. 我在这段代码中做错了什么?
  2. 如何制作对象指针?
  3. 如何指向类的成员函数以及如何使用它们?
  4. 请解释一下这些概念。

4 个答案:

答案 0 :(得分:8)

此处纠正了两个错误:

int main()
{
   golu m, *n;
   void (golu::*t)() =&golu::man; 

   n=&m;
   (n->*t)();
}
  1. 你想要一个功能指针
  2. 运营商的优先级不是您期望的,我必须添加括号。在您需要n->*t();;
  3. 时,(n->*(t()))被解释为(n->*t)()

答案 1 :(得分:4)

成员函数指针具有以下形式:

R (C::*Name)(Args...)

R是返回类型,C是类类型,Args...是函数的任何可能参数(或者没有)。

有了这些知识,你的指针应如下所示:

void (golu::*t)() = &golu::man;

注意成员函数后缺少()。那会尝试调用刚刚获得的成员函数指针,如果没有对象则不可能 现在,使用简单的typedef可以获得更多可读性:

typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;

最后,您不需要指向对象的指针来使用成员函数,但您需要括号:

golu m;
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
(m.*t)();

括号很重要,因为()运算符(函数调用)具有比.*(和->*)运算符更高的优先级(也称为precedence)。 / p>

答案 2 :(得分:2)

'void golu :: * t =&amp; golu :: man();'应改为'void(golu :: * t)()=&amp; golu :: man;'你试图使用指针函数而不是指向静态函数结果的指针!

答案 3 :(得分:1)

(1)未正确声明函数指针。

(2)你应该这样声明:

void (golu::*t) () = &golu::man;

(3)成员函数指针应与class的对象一起使用。