分类: C/C++
2008-04-23 21:40:13
关于构造单实例类的一个问题
作者/
最近一个朋友问我创建单实例的一个问题,他写了一个C 单实例类CSingleton,其构造函数也是private类型。这个类有一个静态函数:GetInstance,它返回单实例类对象的引用,只要用这个函数声明实例便可以限制对象的复制:
// 这一句编译器通不过 CSingleton temp = CSingleton::GetInstance();但是编译器始终在上面这行代码处受阻。这到底是为什么呢?
class CSingleton {
private:
// 私有类型的拷贝构造函数
CSingleton(const CSingleton& obj)
{ ASSERT(FALSE); } // should never happen
};
此外,你还必须实现默认的构造函数,也就是不带参数的构造函数,如果没有默认的构造函数,你将不能创建对象实例。默认的构造函数可以是private类型,也可以是protected类型,这要看你是不是想要从CSingleton派生其它的类。总而言之,要想正确创建单实例类,下面的这些原则或诀窍对你是有帮助的:
// 如果你编译这个程序,会产生错误。参见main函数的注释
//
class CSingleton {
public:
static CSingleton& GetInstance() {
static CSingleton theInstance; // 唯一实例
return theInstance;
}
protected:
// 需要默认的构造函数ctor
// 因为要创建派生类,ctor 为 protected 类型
CSingleton() { }
private:
CSingleton(const CSingleton& o) { }
CSingleton& operator=(const CSingleton& o) { }
};
void main()
{
// 由于构造函数是私有类型的,所以这几行编译通不过:
CSingleton x = CSingleton::GetInstance(); // error: private
// copy ctor!
CSingleton y = CSingleton::GetInstance(); // error: private
// copy ctor!
x = y; // error: private
// assignment!
// 编译器看到这样的实例声明会更满意一些:
CSingleton *p1 = CSingleton::GetInstance();
CSingleton *p2 = p1->GetInstance();
CSingleton & ref = * CSingleton::GetInstance();
}
参考文章: