免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2027 | 回复: 6
打印 上一主题 下一主题

[函数] C++类成员函数指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-22 15:50 |只看该作者 |倒序浏览
想把类的成员函数的指针放到一个成员数组里,如何实现呢?
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]();
}

谢谢了!!!!

论坛徽章:
0
2 [报告]
发表于 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. }
复制代码

论坛徽章:
0
3 [报告]
发表于 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. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-11-22 17:49 |只看该作者

谢谢了!!

谢谢了!!!!!!!
涕零啊 ̄

论坛徽章:
0
5 [报告]
发表于 2005-11-22 18:37 |只看该作者
//作为一个成员函数,它实际上有在编译期内确定的意味,所以,A::fun1是每个类一个的,而不应当是每个实例一个的,也就是说,m_funs应当是一个static的成员变量(per class),而不是per instance。


受教啊。如果不是static,其他的情况就没有一点意义了,我觉得,除非是public数组调用私有函数

论坛徽章:
0
6 [报告]
发表于 2005-11-22 22:40 |只看该作者
典型的用C来思考C++.
没有任何意义.

论坛徽章:
0
7 [报告]
发表于 2005-11-23 09:34 |只看该作者
原帖由 柳五随风 于 2005-11-22 22:40 发表
典型的用C来思考C++.
没有任何意义.


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

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP