企业网站设计师,南宁企业网站排名优化,做网站卖高仿,网站本地环境搭建如果需要一个全局对象#xff0c;如对话框、系统日志、显卡等设备的驱动程序对象、一台PC连接一个键盘等。这样的全局对象只能是一个且是全局的#xff0c;这就是单例模式#xff0c;如何实现呢#xff1f;1 不能在类外部通过构造函数新建对象#xff1a;构造函数的访问方…如果需要一个全局对象如对话框、系统日志、显卡等设备的驱动程序对象、一台PC连接一个键盘等。这样的全局对象只能是一个且是全局的这就是单例模式如何实现呢1 不能在类外部通过构造函数新建对象构造函数的访问方式设置为private或protected。同时拷贝构造函数和赋值运算符也是私有的以禁止拷贝和赋值。2 能够通过调用一个成员函数来实例化一个对象成员函数设置为static这样可以在没有对象存在的情形下通过类名来调用这一成员函数3 需要确保上述成员函数在对象已经存在的情形下不再创建新对象增加一个本类指针的static数据成员作为条件变量。如果是多线程还是可能创建多个实例需要进行Lock操作(如Boost库支持此操作)。#include using namespace std;class Singleton{public: static Singleton *GetInstance() // 静态成员函数构造一个实例 {// Lock(); // 多线程时(Boost库支持Lock操作) if (m_Instance NULL) { m_Instance new Singleton(); // ① }// UnLock();// static Singleton m_Instance; // ② 多线程时 return m_Instance;// return const_cast (m_Instance); // ③ 常量对象只有一次创建的机会 } static void DestoryInstance() { if (m_Instance ! NULL ) { delete m_Instance; m_Instance NULL ; } } // This is just a operation example int GetTest() { return m_Test; }private: Singleton(){ m_Test 10; } // 构造函数私有 Singleton::Singleton(const Singleton) {} // 拷贝构造函数私有 Singleton Singleton::operator(const Singleton) {} // 赋值运算符私有 static Singleton* m_Instance; // 静态数据成员用于判断是否存在类实例 int m_Test; // used for test};Singleton *Singleton ::m_Instance NULL;int main(int argc , char *argv []){ Singleton *singletonObj Singleton ::GetInstance(); coutGetTest()一般的编程观念是new操作需要和delete操作进行匹配上述的实现中添加了一个DestoryInstance的static函数这也是最简单最普通的处理方法了但是很多时候很容易忘记调用DestoryInstance函数就像你忘记了调用delete操作一样。由于怕忘记delete操作所以就有了智能指针那么在单例模型中没有“智能单例”怎么办在实际项目中特别是客户端开发其实是不在乎这个实例的销毁的。因为全局就这么一个变量全局都要用它的生命周期伴随着软件的生命周期软件结束了它也就自然而然的结束了因为一个程序关闭之后它会释放它占用的内存资源的所以也就没有所谓的内存泄漏了。但是有以下情况是必须需要进行实例销毁的如果类中有一些文件锁、文件句柄、数据库连接等这些随着程序的关闭而不会立即关闭的资源必须要在程序关闭前进行手动释放。定义一个供单例类使用的内部GC类用来释放资源。由于程序在结束的时候系统会自动析构所有的全局变量实际上系统也会析构所有类的静态成员变量就像这些静态变量是全局变量一样。我们知道静态变量和全局变量在内存中都是存储在静态存储区的所以在析构时是同等对待的。#include using namespace std;class Singleton{public: static Singleton *GetInstance() { return m_Instance; } int GetTest() { return m_Test; }private: Singleton(){ m_Test 10; } static Singleton *m_Instance; int m_Test; class GC { public : ~GC() { // We can destory all the resouce here, eg:db connector, file handle and so on if (m_Instance ! NULL ) { cout Here is the test GetTest()ref:https://www.cnblogs.com/ring1992/p/9592817.html-End-