要求:设计一个类,保证这个类最多只有一个实例(不能创建多个类实例),并提供一个访问这个实例的接口函数。
本质上创建了多个类对象,但是这些对象均指向一个实例
#include<iostream>
using namespace std;
class Singleton
{
public:
static Singleton* Instance();//private中m_Instance指针的接口函数(只有静态成员函数才可访问静态成员变量
//创建成功后,以下部分便可自由创建类的具体内容,下面是测试用的内容:
void f1() { cout << num; }//非核心代码
char aa = 'a';//非核心代码
private:
/*设定一个静态指针(所有创建的类对象都共用该指针的内容
将指针写在private中是为了防止m_Instance指向的地址内容被外部函数篡改
修改这个指针所存的地址,且修改时只能通过piblic中的接口函数Instance()
进行,通过在Instance()中增加限制条件,实现类最多只有一个实例*/
static Singleton* m_Instance;、
int num;//非核心代码
Singleton() {
m_Instance = NULL;//在第一个实例没有创建之前,现将指针置空(防止野指针)
num = 1;//非核心代码
}
~Singleton() {}
};
Singleton* Singleton::m_Instance = NULL;//静态成员变量只能在类外初始化(为与Instance()中if的内容相匹配)
Singleton* Singleton::Instance() {
//首次创建类对象时,指针为空,这是需要为其动态分配内存地址
if (NULL == m_Instance) {
m_Instance = new Singleton();
}
/*创建过一个类对象后,静态成员变量m_Instance不为空,
每个在其后创建的对象,Instance()通过直接将静态成员变量m_Instance返回给新的成员中的m_Instance
实现所有成员的m_Instance指针均指向同一块内存地址*/
return m_Instance;
}
int main() {
Singleton* p1, * p2;
p1 = Singleton::Instance();
p2 = Singleton::Instance();
p1->f1();
p2->f1();
cout << p1->aa << ' ' << p2->aa << ' ' << char(p2->aa + 1);
}