龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

深度剖析C++语言特点

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
C++作为一种语言,大多数的人都是把它默认为面向对象的支持,认为他就是C语言的替代品,一种延伸而已,而事际上,C++与C是完全不同的语言。用过 C++语言 的朋友都觉得 C++语言 的确

C++作为一种语言,大多数的人都是把它默认为面向对象的支持,认为他就是C语言的替代品,一种延伸而已,而事际上,C++与C是完全不同的语言。用过C++语言的朋友都觉得C++语言的确是个好语言。

但有时由于特殊需要,不得不用C++,在C++中要想实现C#中的Thread等也是可行的,不过代码要稍复杂:

  1. //delegate 0  
  2. #define DEFINE_DELEGATE(NAME, R)  
  3. class NAME##Delegate  
  4. {  
  5. public:  
  6. virtual ~NAME##Delegate(void){ }  
  7. virtual R operator()(void) = 0;  
  8. };  
  9. template  
  10. class NAME##DelegateImpl : public NAME##Delegate  
  11. {  
  12. private:  
  13. typedef R (C::*F)(void);  
  14. C* m_class;  
  15. F m_fun;  
  16. public:  
  17. NAME##DelegateImpl(C* c, F f){ m_class = c; m_fun = f; }  
  18. virtual R operator()(void)  
  19. {  
  20. if(m_class)  
  21. return (m_class-*m_fun)();  
  22. }  
  23. };  
  24. template  
  25. NAME##Delegate* Make##NAME##Delegate(C* c, F f)  
  26. {  
  27. return new NAME##DelegateImpl(c, f);  
  28. }  
  29. //////////////////////////////////////////////////////////////////////////  
  30. //delegate 1  
  31. #define DEFINE_DELEGATE(NAME, R, P1)  
  32. class NAME##Delegate  
  33. {  
  34. public:  
  35. virtual ~NAME##Delegate(void){ }  
  36. virtual R operator()(P1 p1) = 0;  
  37. };  
  38. template  
  39. class NAME##DelegateImpl : public NAME##Delegate  
  40. {  
  41. private:  
  42. typedef R (C::*F)(P1);  
  43. C* m_class;  
  44. F m_fun;  
  45. public:  
  46. NAME##DelegateImpl(C* c, F f){ m_class = c; m_fun = f; }  
  47. virtual R operator()(P1 p1)  
  48. {  
  49. if(m_class)  
  50. return (m_class-*m_fun)(p1);  
  51. }  
  52. };  
  53. template  
  54. NAME##Delegate* Make##NAME##Delegate(C* c, F f)  
  55. {  
  56. return new NAME##DelegateImpl(c, f);  

这个例子比较简单C++语言用来实现某个功能,client是客户程序,要想在m_sdk做处理的时候能发送通知到client,有几个方法可以实现。其一是发线程消息,其一是回调,但传统的回调对面向对象的支持并不好,这就是实现delegate的出发点。 下面是一个实现: class Delegate

  1. DEFINE_DELEGATE(Open, void, int, string)  
  2. class sdk  
  3. {  
  4. public:  
  5. OpenDelegate* pEvent;  
  6. sdk(): pEvent(NULL) { }  
  7. void Open()  
  8. {  
  9. cout  
  10. if(pEvent != NULL)  
  11. (*pEvent)(100, "你好");  
  12. }  
  13. };  
  14. class client  
  15. {  
  16. private:  
  17. sdk m_sdk;  
  18. public:  
  19. client()  
  20. {  
  21. m_sdk.pEvent = MakeOpenDelegate(this, OnOpen2);  
  22. }  
  23. void Open()  
  24. {  
  25. m_sdk.Open();  
  26. }  
  27. void OnOpen()  
  28. {  
  29. cout  
  30. }  
  31. void OnOpen2(int t, string str)  
  32. {  
  33. cout  
  34. }  
  35. }; 
精彩图集

赞助商链接