Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49709
  • 博文数量: 5
  • 博客积分: 83
  • 博客等级: 民兵
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-03 10:07
文章分类

全部博文(5)

文章存档

2013年(1)

2012年(4)

我的朋友

分类: C/C++

2012-05-03 15:17:24


点击(此处)折叠或打开

  1. #include <stdio.h>


  2. class SomeThingA
  3. {
  4.     typedef int (SomeThingA::*test1Fun)();
  5.     typedef int (*testFun)();
  6. public:
  7.     int a;
  8.     int b;
  9.     int c;
  10.     int test1();
  11.     void test2(int arg1);
  12.     test1Fun fun1;
  13.     testFun fun;
  14. };

  15. int SomeThingA::test1()
  16. {
  17.     return 1;
  18. }

  19. void SomeThingA::test2(int arg1)
  20. {
  21.     return ;
  22. }

  23. static int test()
  24. {
  25.     return -1;
  26. }

  27. typedef int (SomeThingA::*test1Fun)(void);
  28. typedef void (SomeThingA::*test2Fun)(int);

  29. int main()
  30. {
  31.     SomeThingA abc;
  32.     SomeThingA *pabc = &abc;
  33.     abc.a = 1;
  34.     abc.b = 2;
  35.     abc.c = 3;

  36.     test1Fun lfun1 = &SomeThingA::test1;
  37.     test2Fun lfun2 = &SomeThingA::test2;


  38.     abc.fun1 = &SomeThingA::test1;
  39.     abc.fun = *test;

  40.     printf("val:%d\n",(pabc->*abc.fun1)());
  41.     printf("val:%d\n",(abc.*abc.fun1)());
  42.     printf("val:%d\n",(pabc->*lfun1)());
  43.     printf("val:%d\n",(abc.*lfun1)());
  44.     printf("val:%d\n",abc.fun());


  45.     return 0;    
  46. }
C++中没有实现C#中委托的概念,成员函数指针的语法显得十分的鸡肋而且未被充分标准化。但是在MFC中此语法被用于消息传递机制(后续的文章中打算介绍)。下面先来介绍一下函数指针的语法问题

C++为成员函数指针扩展了三个操作符  分别为 ::*  ->*  .*
看上去有些诡异, 其中::*用于声明函数指针。 ->* 用于堆上调用  .*用于栈上调用

声明语法如上所述  如: 

点击(此处)折叠或打开

  1. typedef int (SomeThingA::*test1Fun)(void);

注意这里的符号是用 ::* 这是一个独立的运算符 而且优先级较低

printf("val:%d\n",(pabc->*lfun1)());       //堆上调用
printf("val:%d\n",(abc.*lfun1)());         //栈上调用


阅读(1351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~