首页 > 代码库 > 真实的C++单例模式举例

真实的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 };

 

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