当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 关于构造单实例类的一个问题

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 关于构造单实例类的一个问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 77 ::
收藏到网摘: n/a

关于构造单实例类的一个问题


作者/NorthTibet

下载源代码

   最近一个朋友问我创建单实例的一个问题,他写了一个C++单实例类CSingleton,其构造函数也是private类型。这个类有一个静态函数:GetInstance,它返回单实例类对象的引用,只要用这个函数声明实例便可以限制对象的复制:

// 这一句编译器通不过 CSingleton temp = CSingleton::GetInstance(); 
但是编译器始终在上面这行代码处受阻。这到底是为什么呢?
    其实,这个问题只要弄清楚编译器处理单实例类的一些细节,问题便会迎刃而解。当编译器碰到上面的这条语句时,它会去寻找类的拷贝构造函数,所谓的拷贝构造函数,就是一个署名为CSingleton(const CSingleton&)的构造函数。如果你没有提供这个拷贝构造函数,那么C++编译器会为你提供一个默认的拷贝构造函数。这个默认的拷贝构造函数做的事情很简单,只是将字节从一个对象靠到另一个对象。如果你想这个拷贝构造函数它干点别的什么事情,你必须实现自己的拷贝构造函数。为了限制对象的复制,还必须使这个拷贝构造函数为private类型:
class CSingleton {private: // 私有类型的拷贝构造函数 CSingleton(const CSingleton& obj) { ASSERT(FALSE); } // should never happen};
此外,你还必须实现默认的构造函数,也就是不带参数的构造函数,如果没有默认的构造函数,你将不能创建对象实例。默认的构造函数可以是private类型,也可以是protected类型,这要看你是不是想要从CSingleton派生其它的类。总而言之,要想正确创建单实例类,下面的这些原则或诀窍对你是有帮助的:
  • 创建默认构造函数、拷贝构造函数和赋值操作符,并且它们的类型都为私有类型。
  • 创建一个静态函数GetInstance,用它来返回唯一的对象实例
下面是一个具体的例子代码:
// 如果你编译这个程序,会产生错误。参见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();} 
参考文章:
  • 单实例设计模式的实现
  • 如何保证在应用程序使用的类只有一个对象实例?