真实的C++单例模式举例

把构造函数声明为protected的理由很简单,但把构造函数声明为private的原因却很少知道.
 
从语法上讲,任何函数如果被声明为private,这个函数就不能从外部调用,构造函数也是函数,相反,只能成为在内部使用的构造函数,但偏偏有些场景就是要这样处理,才可以达到一定的程序设计效果:
 
1.屏蔽构造函数,就是不让你创建这个类的对象,就是不想让你在外面的其他函数中直接new这个类,而只能从此类内部进行构造(如下面的代码)。
2.阻止其他函数中执行此类的拷贝构造函数或赋值操作符,避免编译器自动生成默认的拷贝构造函数,不想按照默认的拷贝构造函数进行逐字段拷贝或赋值操作符,这时可以把拷贝构造函数或赋值操作符声明成private的
 
 1 class IOCP
 2 {
 3 private:
 4      IOCP()
 5      {
 6           //创建完成端口(备注:OS维护的一个队列,OS把i/o操作已经完成的事件通知放到这里)的句柄
 7           if ((m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL)     
 8                ;
 9           //创建工作线程,用来处理完成端口消息的  
10           m_hWorkerThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_workerThreadID); 
11      };
12      ~IOCP();
13 private:
14      static IOCP* m_instance;
15 public:
16      static IOCP* Instance()
17      {
18           if( m_instance == NULL )
19           {
20                m_instance = new IOCP();
21           }
22           return m_instance;
23      }
24      void Wait();
25      static DWORD __stdcall WorkThread(LPVOID Param); 
26      HANDLE m_hIOCP; //完成端口的句柄 
27 private: 
28      HANDLE m_hWorkerThread; //工作线程句柄 
29      DWORD m_workerThreadID; 
30 public:
31      //将套接字绑定到完成端口
32      bool RegisterToCompletionPort( SOCKET socket , void* completionKey);
33 };

 

posted @ 2014-12-19 21:22  一名老程序员  阅读(381)  评论(0编辑  收藏  举报