深度剖析C 语言特点
创始人
2024-06-21 22:20:37
0

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);\  
  57.   } 

这个例子比较简单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.   }; 

【编辑推荐】

  1. C与C++中标准输入实现方式上的一点区别
  2. C++编译器如何对Const常量进行分配存储空间
  3. C++类库设计的基本构思与方法
  4. 玩转C++语言的几种方法
  5. 如何更好的进行C++代码编制

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...