C++单例模式的实现
C++类成员可以是引用类型
由于C++的类成员必然是在类的创建时创建的。
而且C++又提供了一个引用机制,而一个引用创建时必须有一个引用对象才能初始化。
所以做如下测试
考虑如下代码:
#include <iostream>
class BaseInstance
{
public:
static BaseInstance& Instance()
{
static BaseInstance _inst;
return _inst;
}
private:
BaseInstance(){};
~BaseInstance(){};
};
class Test
{
public:
Test():_inst(BaseInstance::Instance()){};
BaseInstance & _inst;
};
int main(int argc, char** argv)
{
Test a;
return 0;
}
上面的代码完全可以通过编译。
单例模式可以用引用来实现
所以在实现单例模式时,可以通过使用引用,而不是一个指针来实现,应该说会更加安全,避免了指针操作的危险性和不方便。
一个问题:含有一个引用的类在析构时,它所包含的引用会被析构么?
#include <iostream>
class BaseInstance
{
public:
static BaseInstance& Instance()
{
static BaseInstance _inst;
return _inst;
}
static int countplus()
{
static int count = 0;
count++;
return count;
}
private:
BaseInstance(){};
~BaseInstance(){};
};
class Test
{
public:
Test()
: _inst(BaseInstance::Instance()){};
BaseInstance& _inst;
void countplus()
{
_inst.countplus();
}
};
int main(int argc, char** argv)
{
{
Test a;
a.countplus();
}
std::cout<<BaseInstance::Instance().countplus()<<std::endl;
return 0;
}
考虑以上代码
可以想到,如果输出1则被析构了,输出2则没有。
测试结果如下:
结果显然,所以在一个事件分发系统中是可以安全使用的。