【C++练习题】实现单例模型
题目:设计一个类,我们只能生成该类的一个实例。
分析:由于要求类只能实例化一个唯一对象,我们要将类的构造函数私有化,避免别人直接通过类来创建对象。同时在类中声明一个指向这个唯一对象的指针,使用static关键字修饰为静态指针。
具体步骤:
1.将类的构造函数私有化
2.类中声明指向类的指针,并在外部进行初始化
3.将类的指针私有化,并提供get方法访问这个指针
4.将拷贝函数私有化
代码实现
我的码云:https://gitee.com/hinzer/my-notes-of-C_plus/tree/master/step7
案例1:ChairMan
实现设计单例模型,保证只能实例化以为ChairMan对象。
#include "iostream"
using namespace std;
class ChairMan
{
private:
ChairMan()
{//1.私有化构造函数,防止外部直接使用类来创建实例
cout << "ChairMan" << endl;
}
ChairMan(const ChairMan &c)
{//私有化拷贝函数
}
public:
static ChairMan* getSingleMan() //static方法只能获取static属性
{//3.将指针私有化,通过这个函数获取指针的引用
return singleMan;
}
private:
static ChairMan* singleMan; //2.声明指向ChairMan的指针
};
ChairMan* ChairMan::singleMan = new ChairMan; //2.在外部初始化这个指针,同时声明为全局
void test01()
{
//指针是入口,通过getSingleMan方法返回指针的引用
ChairMan* man1 = ChairMan::getSingleMan();
ChairMan* man2 = ChairMan::getSingleMan();
if (man1 == man2)
{
cout << "man1 与 man2相同" << endl;
}
else
{
cout << "man1 与 man2不相同" << endl;
}
}
int main(int argc, char const *argv[])
{
test01();
return 0;
}
案例2:Printer
打印机模型,只有一个实例化的Printer对象。通过printText方法实现打印信息,并统计打印次数。
#include "iostream"
#include "string"
using namespace std;
class Printer
{//实现(单例)打印机类
private:
Printer()
{//1.私有化默认构造
pnum = 0; //初始化打印次数
}
Printer(const Printer &c)
{//1.私有化拷贝构造
}
public:
static Printer* getInstance()
{//3.获取指向实例的指针
return singlePrinter;
}
void printText(string str)
{//实现打印信息的方法,并统计打印次数
cout << str << endl;
pnum++;
cout << "积累打印次数:"<< pnum << endl;
}
private:
static Printer* singlePrinter; //2.声明指向Printer类的指针
int pnum;
};
Printer* Printer::singlePrinter = new Printer; //2.初始化指针,指向唯一实例
void test01()
{
Printer* p = Printer::getInstance(); //p指向唯一实例
p->printText("hello hinzer");
}
int main(int argc, char const *argv[])
{
test01();
return 0;
}
运行窗口