#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;
}