- #include <stdio.h>
- class SomeThingA
- {
- typedef int (SomeThingA::*test1Fun)();
- typedef int (*testFun)();
- public:
- int a;
- int b;
- int c;
- int test1();
- void test2(int arg1);
- test1Fun fun1;
- testFun fun;
- };
- int SomeThingA::test1()
- {
- return 1;
- }
- void SomeThingA::test2(int arg1)
- {
- return ;
- }
- static int test()
- {
- return -1;
- }
- typedef int (SomeThingA::*test1Fun)(void);
- typedef void (SomeThingA::*test2Fun)(int);
- int main()
- {
- SomeThingA abc;
- SomeThingA *pabc = &abc;
- abc.a = 1;
- abc.b = 2;
- abc.c = 3;
- test1Fun lfun1 = &SomeThingA::test1;
- test2Fun lfun2 = &SomeThingA::test2;
- abc.fun1 = &SomeThingA::test1;
- abc.fun = *test;
- printf("val:%d\n",(pabc->*abc.fun1)());
- printf("val:%d\n",(abc.*abc.fun1)());
- printf("val:%d\n",(pabc->*lfun1)());
- printf("val:%d\n",(abc.*lfun1)());
- printf("val:%d\n",abc.fun());
- return 0;
- }
C++中没有实现C#中委托的概念,成员函数指针的语法显得十分的鸡肋而且未被充分标准化。但是在MFC中此语法被用于消息传递机制(后续的文章中打算介绍)。下面先来介绍一下函数指针的语法问题
C++为成员函数指针扩展了三个操作符 分别为 ::* ->* .*
看上去有些诡异, 其中::*用于声明函数指针。 ->* 用于堆上调用 .*用于栈上调用
声明语法如上所述 如:
- typedef int (SomeThingA::*test1Fun)(void);
注意这里的符号是用 ::* 这是一个独立的运算符 而且优先级较低
printf("val:%d\n",(pabc->*lfun1)()); //堆上调用
printf("val:%d\n",(abc.*lfun1)()); //栈上调用
阅读(1381) | 评论(0) | 转发(0) |