Chinaunix

标题: C++类成员函数指针的问题 [打印本页]

作者: lrh3025    时间: 2005-11-22 15:50
标题: C++类成员函数指针的问题
想把类的成员函数的指针放到一个成员数组里,如何实现呢?
typedef void(A::*FUN)();
class A
{
public:
    void init();
    void fun( int );
private:
    void fun1( ){}
    void fun2( ){}
private:
    FUN m_funs[2];
};
void A::init( )
{
    m_funs[0] = fun1;
    m_funs[1] = fun2;
}
void fun( int i )
{
    m_funs[i]();
}

谢谢了!!!!
作者: whyglinux    时间: 2005-11-22 16:41
  1. class A;                        // Add the declaration of class A.
  2. typedef void(A::*FUN)();

  3. class A
  4. {
  5. public:
  6.   void init();
  7.   void fun( int );
  8. private:
  9.   void fun1( ){}
  10.   void fun2( ){}
  11. private:
  12.   FUN m_funs[2];
  13. };
  14. void A::init( )
  15. {
  16.   //  m_funs[0] = fun1;
  17.   //  m_funs[1] = fun2;
  18.   m_funs[0] = &A::fun1;
  19.   m_funs[1] = &A::fun2;
  20. }
  21. // void fun( int i )
  22. void A::fun( int i )
  23. {
  24.   //  m_funs[i]();
  25.   (this->*m_funs[i])();
  26. }
复制代码

作者: renstone921    时间: 2005-11-22 17:39

  1. #include <iostream>
  2. using namespace std;

  3. class A; //前制声明

  4. typedef void (A::*FUN)(); //定义了一个成员函数指针类型,该类型的函数定义在class A范围内,接受void参数,返回void类型

  5. class A
  6. {
  7.   friend void fun(A&, int);         //要访问类的私有成员,必须声明该函数为类的友元,同时,为了存取对象的数据,必须传入一个对象的实例作为参数
  8. public:
  9.   void init();
  10. private
  11.   void fun1( )
  12.   {
  13.     cout << "func1" << endl;
  14.   }
  15.   void fun2( )
  16.   {
  17.     cout <<"func2" << endl;
  18.   }
  19. private:
  20.   FUN m_funs[2];
  21. };

  22. //想知道你这样做的目的是什么?
  23. //作为一个成员函数,它实际上有在编译期内确定的意味,所以,A::fun1是每个类一个的,而不应当是每个实例一个的,也就是说,m_funs应当是一个static的成员变量(per class),而不是per instance。
  24. void A::init( )
  25. {
  26.   m_funs[0]= &A::fun1;            //应当是类A域里的函数的地址
  27.   m_funs[1] = &A::fun2;
  28. }

  29. void fun(A& a, int i)         
  30. {
  31.   (a.*(a.m_funs[i]))();              //m_funs是对象a中的一个数组,该数组的元素是一个FUN类型的指针
  32. }

  33. int main()
  34. {
  35.   A a;
  36.   a.init();
  37.   fun(a, 0);
  38.   fun(a, 1);


  39.   return (0);
  40. }
复制代码

作者: lrh3025    时间: 2005-11-22 17:49
标题: 谢谢了!!
谢谢了!!!!!!!
涕零啊 ̄
作者: gooderfeng    时间: 2005-11-22 18:37
//作为一个成员函数,它实际上有在编译期内确定的意味,所以,A::fun1是每个类一个的,而不应当是每个实例一个的,也就是说,m_funs应当是一个static的成员变量(per class),而不是per instance。


受教啊。如果不是static,其他的情况就没有一点意义了,我觉得,除非是public数组调用私有函数
作者: 柳五随风    时间: 2005-11-22 22:40
典型的用C来思考C++.
没有任何意义.
作者: whyglinux    时间: 2005-11-23 09:34
原帖由 柳五随风 于 2005-11-22 22:40 发表
典型的用C来思考C++.
没有任何意义.


对于同一个问题,往往由于人们站的角度不同或者视野受到的局限性,对这个问题会有不同甚至相反的看法:在我眼中一文不值的一块甲骨龟片,对于考古学者来说却是无价之宝。这是很正常的,符合辨正法。

说这些话的意思是:我们可以畅所欲言,发表自己的看法;但是不要轻易否定别人的观点以及行为,或者说不要轻易下结论,因为彼此的立场和看问题的角度可能是不同的。比如,对于这个程序来说,如果你能正确地实现楼主的要求,从而掌握或者加深了解关于成员函数指针的概念(成员函数指针比一般的指针无论在概念上还是操作上都要复杂一些),不也是很有意义的吗?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2