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

时间:2023-03-10 02:09:05
真实的C++单例模式举例
把构造函数声明为protected的理由很简单,但把构造函数声明为private的原因却很少知道.

从语法上讲,任何函数如果被声明为private,这个函数就不能从外部调用,构造函数也是函数,相反,只能成为在内部使用的构造函数,但偏偏有些场景就是要这样处理,才可以达到一定的程序设计效果:

1.屏蔽构造函数,就是不让你创建这个类的对象,就是不想让你在外面的其他函数中直接new这个类,而只能从此类内部进行构造(如下面的代码)。
2.阻止其他函数中执行此类的拷贝构造函数或赋值操作符,避免编译器自动生成默认的拷贝构造函数,不想按照默认的拷贝构造函数进行逐字段拷贝或赋值操作符,这时可以把拷贝构造函数或赋值操作符声明成private的
 class IOCP
{
private:
IOCP()
{
//创建完成端口(备注:OS维护的一个队列,OS把i/o操作已经完成的事件通知放到这里)的句柄
if ((m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, )) == NULL)
;
//创建工作线程,用来处理完成端口消息的
m_hWorkerThread = CreateThread(NULL, , WorkThread, (LPVOID)this, , &m_workerThreadID);
};
~IOCP();
private:
static IOCP* m_instance;
public:
static IOCP* Instance()
{
if( m_instance == NULL )
{
m_instance = new IOCP();
}
return m_instance;
}
void Wait();
static DWORD __stdcall WorkThread(LPVOID Param);
HANDLE m_hIOCP; //完成端口的句柄
private:
HANDLE m_hWorkerThread; //工作线程句柄
DWORD m_workerThreadID;
public:
//将套接字绑定到完成端口
bool RegisterToCompletionPort( SOCKET socket , void* completionKey);
};