您的位置:首页 > 其它

设计模式之单例模式 (模板 智能指针 删除器) 实现【饿汉】

2016-03-29 16:39 393 查看
上一篇实现的是使用模板 智能指针 删除器的懒汉模式单例。

这一篇实现饿汉模式的版本。

#include <iostream>
#include <memory>
#include <windows.h>
#include <process.h>

using namespace std;

template <class T>
class CEagerSingletonPtr
{
private:
static T m_sg;

private:
CEagerSingletonPtr(const CEagerSingletonPtr&){}
CEagerSingletonPtr& operator=(const CEagerSingletonPtr&){}
protected:
CEagerSingletonPtr()
{
cout << "CEagerSingletonPtr begin construct" << endl;
::Sleep(1000);
cout << "CEagerSingletonPtr end construct" << endl;
}
protected:
virtual ~CEagerSingletonPtr()
{
cout << "CEagerSingletonPtr destrcut" << endl;
}
public:
static T& getInstance()
{
return m_sg;
}
};

// 类内静态变量初始化
template <class T>
T CEagerSingletonPtr<T>::m_sg;

// 实例化模板
class EagerManager : public CEagerSingletonPtr<EagerManager>
{
friend class CEagerSingletonPtr<EagerManager>;
protected:
EagerManager()
{
cout << "EagerManager begin construct" << endl;
::Sleep(500);
m_count = 0;
cout << "EagerManager end construct" << endl;
}
~EagerManager()
{
cout << "EagerManager destrcut" << endl;
}
public:
void print()
{
cout << "Hello, this is EagerManage " << m_count++ << endl;
}
private:
int m_count;		// 私有静态变量
};

unsigned int __stdcall threadFun(void*)
{
cout << "Current Thread ID = " << ::GetCurrentThreadId() << endl;

EagerManager::getInstance().print();
return 0;
}

void testMultiThread()
{
for (int i = 0; i < 3; ++i)
{
uintptr_t th = ::_beginthreadex(NULL, 0, threadFun, NULL, 0, NULL);
::CloseHandle((HANDLE)th);
}
}

int main(void)
{
cout<<"欢迎进入主线程 ID = "<<::GetCurrentThreadId()<<endl;
testMultiThread();

getchar();

return 0;
}


运行结果图:



静态的单例是在主线程(main函数)之前就已经创建好。

当然这个版本还是有问题。 水太深~。。。

参见:Scott Meyers在其《Effective C++》第三版中的04条款的说明:

"

C++标准对于不同的编译单元内的Non-Local-Static对象的初始化相对次序并无明确定义。

如果某一个编译单元内的某个Non-Local-Static对象的初始化,使用了另一个编译单元内的

某个Non-Local-Static对象,它所用到的对象可能尚未被初始化。

"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: