【C++练习题】实现单例模型

举报
王建峰 发表于 2021/11/19 01:46:00 2021/11/19
【摘要】 题目:设计一个类,我们只能生成该类的一个实例。 分析:由于要求类只能实例化一个唯一对象,我们要将类的构造函数私有化,避免别人直接通过类来创建对象。同时在类中声明一个指向这个唯一对象的指针,使用static关键字修饰为静态指针。 具体步骤: 1.将类的构造函数私有化 2.类中声明指向类的指针,并在外部进行初始化 3.将类的指针私有化...

题目:设计一个类,我们只能生成该类的一个实例。

分析:由于要求类只能实例化一个唯一对象,我们要将类的构造函数私有化,避免别人直接通过类来创建对象。同时在类中声明一个指向这个唯一对象的指针,使用static关键字修饰为静态指针。

具体步骤

1.将类的构造函数私有化
2.类中声明指向类的指针,并在外部进行初始化
3.将类的指针私有化,并提供get方法访问这个指针
4.将拷贝函数私有化

 

代码实现

我的码云:https://gitee.com/hinzer/my-notes-of-C_plus/tree/master/step7

 

案例1:ChairMan

实现设计单例模型,保证只能实例化以为ChairMan对象。


  
  1. #include "iostream"
  2. using namespace std;
  3. class ChairMan
  4. {
  5. private:
  6. ChairMan()
  7. {//1.私有化构造函数,防止外部直接使用类来创建实例
  8. cout << "ChairMan" << endl;
  9. }
  10. ChairMan(const ChairMan &c)
  11. {//私有化拷贝函数
  12. }
  13. public:
  14. static ChairMan* getSingleMan() //static方法只能获取static属性
  15. {//3.将指针私有化,通过这个函数获取指针的引用
  16. return singleMan;
  17. }
  18. private:
  19. static ChairMan* singleMan; //2.声明指向ChairMan的指针
  20. };
  21. ChairMan* ChairMan::singleMan = new ChairMan; //2.在外部初始化这个指针,同时声明为全局
  22. void test01()
  23. {
  24. //指针是入口,通过getSingleMan方法返回指针的引用
  25. ChairMan* man1 = ChairMan::getSingleMan();
  26. ChairMan* man2 = ChairMan::getSingleMan();
  27. if (man1 == man2)
  28. {
  29. cout << "man1 与 man2相同" << endl;
  30. }
  31. else
  32. {
  33. cout << "man1 与 man2不相同" << endl;
  34. }
  35. }
  36. int main(int argc, char const *argv[])
  37. {
  38. test01();
  39. return 0;
  40. }

 

案例2:Printer

打印机模型,只有一个实例化的Printer对象。通过printText方法实现打印信息,并统计打印次数。


  
  1. #include "iostream"
  2. #include "string"
  3. using namespace std;
  4. class Printer
  5. {//实现(单例)打印机类
  6. private:
  7. Printer()
  8. {//1.私有化默认构造
  9. pnum = 0; //初始化打印次数
  10. }
  11. Printer(const Printer &c)
  12. {//1.私有化拷贝构造
  13. }
  14. public:
  15. static Printer* getInstance()
  16. {//3.获取指向实例的指针
  17. return singlePrinter;
  18. }
  19. void printText(string str)
  20. {//实现打印信息的方法,并统计打印次数
  21. cout << str << endl;
  22. pnum++;
  23. cout << "积累打印次数:"<< pnum << endl;
  24. }
  25. private:
  26. static Printer* singlePrinter; //2.声明指向Printer类的指针
  27. int pnum;
  28. };
  29. Printer* Printer::singlePrinter = new Printer; //2.初始化指针,指向唯一实例
  30. void test01()
  31. {
  32. Printer* p = Printer::getInstance(); //p指向唯一实例
  33. p->printText("hello hinzer");
  34. }
  35. int main(int argc, char const *argv[])
  36. {
  37. test01();
  38. return 0;
  39. }

 

运行窗口

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/93632160

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200