C++ 控制对象生成数量的一个方法
2018-03-09 13:30
357 查看
如果一个类希望自己的对象数量可以控制在一定范围的话,可以采用对象计数的方式。在类中添加对象当前的数量和对象总共的数量(都设置为静态的全局类型)
但是类可能会通过被继承或者其他方式产生新的对象,需要杜绝这种方式,所以采用伪构造函数的方式。
伪构造函数就是将构造函数定义为私有类型,然后通过其他的供油成员函数调用构造函数来实现对象的产生,从而杜绝了构造函数和复制构造函数这两种产生新的对象的途径(带有私有构造函数的类不能用作基类,也不可以内嵌于其他对象中)。
类定义如下:
打印结果为:
但是类可能会通过被继承或者其他方式产生新的对象,需要杜绝这种方式,所以采用伪构造函数的方式。
伪构造函数就是将构造函数定义为私有类型,然后通过其他的供油成员函数调用构造函数来实现对象的产生,从而杜绝了构造函数和复制构造函数这两种产生新的对象的途径(带有私有构造函数的类不能用作基类,也不可以内嵌于其他对象中)。
类定义如下:
#include <iostream> #include <string> using namespace std; class TooManyObjects{}; //异常 class Printer { public: //TooManyObjects t; //伪构造函数 static Printer *makePrinter(); //声明为static所以可以直接调用 static Printer *makePrinter(const Printer &rhs); //dtor ~Printer(){--numObjects;} #if 1 friend ostream &operator <<(ostream &out, const Printer &p){ out << "现在的数量为:" << p.numObjects << endl; return out; } #endif private: static size_t numObjects; static const size_t maxObjects = 10; //私有构造函数 Printer(); Printer(const Printer &rhs); }; size_t Printer::numObjects = 0; const size_t Printer::maxObjects; Printer::Printer() { if(numObjects >= maxObjects) throw TooManyObjects(); ++numObjects; } Printer::Printer(const Printer &rhs) { if(numObjects >= maxObjects) throw TooManyObjects(); ++numObjects; } Printer *Printer::makePrinter() { return new Printer; } Printer *Printer::makePrinter(const Printer &rhs) { return new Printer(rhs); } int main() { Printer *p = Printer::makePrinter(); Printer *p1 = Printer::makePrinter(); Printer *p2 = Printer::makePrinter(); Printer *p3 = Printer::makePrinter(); Printer *p4 = Printer::makePrinter(); Printer *p5 = Printer::makePrinter(); Printer *p6 = Printer::makePrinter(); Printer *p7 = Printer::makePrinter(); Printer *p8 = Printer::makePrinter(); Printer *p9 = Printer::makePrinter(); try{ Printer *p10 = Printer::makePrinter(); } catch(TooManyObjects &t){ cout << "too mant objects" << endl; } cout << *p; return 0; }
打印结果为:
相关文章推荐
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- C++ 设计一个类,只能生成一个对象
- c++在调用类的时候不一定非得实例化对象哦,有时候你不写系统会为你默认生成一个临时实例对象哦~
- 定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
- C++ 销毁一个自定义对象后,它里面的成员方法去哪儿了?
- 使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象
- 【面试题】剑指Offer-2-如何控制一个类生成对象的个数
- 工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。
- C++定义一个只能在堆上(栈上)生成对象的类
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
- 如何控制JAVA中一个类只能生成一个对象?
- c++限制某个class所能产生对象数量的方法
- 用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- C++ 限制类对象的数量的方法
- 通过反射机制创建一个构造方法中参数数量可变的对象
- console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
- C++第5周任务【任务2】本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为第10章做运算符重载等积累些感性认识。