//单例模式。
//为了确保只有一个实例,需要保护它的构造函数,拷贝构造函数以及赋值运算符重载函数,
使其不能被公开调用,故声明为private权限。
//一旦出现误操作,将会直接报错,避免无形中增加实例,
造成不必要的错误。
#include <iostream>
using namespace std;
class SingleTon
{
public:
~SingleTon();
static SingleTon* getInstance(); //获得一个实例
void print();
void setSingleTon(const int age);
private:
SingleTon(); //默认构造函数
SingleTon(const SingleTon& single); //拷贝构造函数
const SingleTon& operator=(const SingleTon& single);//赋值运算符重载函数
int Age;
static SingleTon* instance; //唯一实例
};
SingleTon * SingleTon::instance = NULL;
SingleTon::SingleTon()
{
Age = 99;
cout << "SingleTon default constructor called !" << endl;
}
SingleTon::SingleTon(const SingleTon& single)
{
//cout << "SingleTon copy constructor called !" << endl;//正常情况下,这句话是不能被打印出的。
}
const SingleTon& SingleTon::operator=(const SingleTon& single)
{
return *this;
}
SingleTon::~SingleTon()
{
//delete instance;//不能在此delete instance,会造成死循环
cout << "SingleTon destructor called!" << endl;
}
void SingleTon::setSingleTon(const int age)
{
Age = age;
}
SingleTon * SingleTon::getInstance()
{
if (instance == NULL) //控制单例
{
instance = new SingleTon();
//cout << sizeof(*instance) <<endl;
}
return instance;
}
void SingleTon::print()
{
cout << "I wanna live to " << Age << endl;
}
int main()
{
SingleTon *s1 = SingleTon::getInstance();
SingleTon *s2 = SingleTon::getInstance(); //不再生成新的实例
s1->print();
s2->print();
cout << endl << endl;
s1->setSingleTon(100);
s2->print(); //改变的是同一个实例。
s1->print();
cout << endl << endl;
s2->setSingleTon(120);
s2->print();
s1->print();
delete s1; //调用析构函数,删除单例。
return 0;
}