#include <iostream>
#include <string.h>
using std::cout;
using std::endl;
// 单例模式
class Singleton
{
public:
// 3) 定义一个返回值为类指针的静态成员函数
// 只有第一次调用getInstance时,才创建对象,之后所有的调用,都直接返回第一次创建的对象
static Singleton *getInstance()
{
if(nullptr == _pInstance) // 静态成员函数只能访问静态数据成员,所以_pInstance只能变成静态的
{
_pInstance = new Singleton();
}
return _pInstance;
}
static void destroy()
{
if(_pInstance){
// 在类内部执行delete表达式
delete _pInstance; // 销毁对象会调用析构函数
}
}
private:
// 1) 将构造函数私有化——该对象不能是一个栈对象,全局/静态对象,该对象只能是一个堆对象
Singleton(){ cout << "Singleton()" << endl; }
// 不能只创建不销毁,将析构函数也放在私有区,这样delete ps1就无法执行
~Singleton(){ cout << "~Singleton()" << endl; }
// 2) 在类中定义一个静态的指向本类型的指针变量
static Singleton * _pInstance;
};
Singleton * Singleton::_pInstance = nullptr; // 静态成员的初始化
void test0()
{
// new表达式在执行的过程中会创建对象,一定会调用构造函数
// Singleton *ps1 = new Singleton; // error,在类之外无法操作
Singleton * ps1 = Singleton::getInstance(); // 静态的成员函数可以通过类名进行调用,不需要对象
Singleton * ps2 = Singleton::getInstance();
cout << "ps1:" << ps1 << endl;
cout << "ps2:" << ps2 << endl;
// delete ps1; // error 可以完成功能,但是不推荐
Singleton::destroy();
}
int main(int argc,char*argv[])
{
test0();
return 0;
}