一个具有对象计数功能的基类
2012-10-17 20:15
260 查看
参考<<More Effective C++>>一书中的条款26:"限制某个class所能产生的对象数量",参照"一个用来计算对象个数的基类"中的代码,简单的将里面的代码实现。一个具有对象计数功能的基类,简单来说,就是完成一个base class,作为对象计数之用,并让诸如Printer之类的class继承它。更多内容请参考<<More Effective C++>>一书中的条款26,那里有很详细的描述,这里不再讲解。下面来看看代码是如何实现的。
代码如下:
运行界面如下:
代码如下:
#include "stdafx.h" #include <iostream> using namespace std; //一个具有对象计数功能的基类 template<class BeingCounted> class Counted { public: class TooManyObjects{}; //定义一个异常类 static int objectCount() { return numObjects; } protected: Counted(); Counted(const Counted& rhs); ~Counted() { cout<<"销毁第 "<<numObjects<<" 个实例"<<endl; --numObjects; } private: static int numObjects; //当前产生实例的个数 static const size_t maxObjects; //可以产生实例的最多个数 void init(); }; template<class BeingCounted> Counted<BeingCounted>::Counted() { init(); } template<class BeingCounted> Counted<BeingCounted>::Counted(const Counted& rhs) { init(); } template<class BeingCounted> void Counted<BeingCounted>::init() { if (numObjects >= maxObjects) //产生的实例大于最大值就抛出异常 { throw TooManyObjects(); } cout<<"构造第 "<<numObjects + 1<<" 个实例"<<endl; ++numObjects; } //继承自具有对象计数功能的基类 class Printer : private Counted<Printer> { public: static Printer* makePrinter(); static Printer* makePrinter(const Printer& rhs); ~Printer(); using Counted<Printer>::objectCount; //使基类的objectCount()在子类可见 using Counted<Printer>::TooManyObjects; //使基类的TooManyObjects在子类可见 private: Printer(); Printer(const Printer& rhs); }; template<class BeingCounted> int Counted<BeingCounted>::numObjects; const size_t Counted<Printer>::maxObjects = 5; //最多5个 Printer::Printer() { } Printer::~Printer() { } Printer::Printer(const Printer& rhs) { } Printer* Printer::makePrinter() { return new Printer; } Printer* Printer::makePrinter(const Printer& rhs) { return new Printer(rhs); } int _tmain(int argc, _TCHAR* argv[]) { Printer *p1 = Printer::makePrinter(); Printer *p2 = Printer::makePrinter(); Printer *p3 = Printer::makePrinter(*p1); Printer *p4 = Printer::makePrinter(*p2); Printer *p5 = Printer::makePrinter(); delete p4; delete p5; p4 = Printer::makePrinter(); p5 = Printer::makePrinter(); try { p1 = Printer::makePrinter(); //Printer产生的实例大于5,则抛出异常 } catch (Printer::TooManyObjects) { cout<<"TooManyObjects"<<endl; } delete p1; delete p2; delete p3; delete p4; delete p5; cout<<"剩余实例为:"<<Printer::objectCount()<<endl; return 0; }
运行界面如下:
相关文章推荐
- 一个具有对象计数功能的基类
- 冰编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- 并编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- 构造器的拷贝功能(对象应该有一个创建自身的方法)
- javascript下判断一个对象是否具有指定名称的属性的的代码
- 实现一个新闻列表的功能,并且具有分页的功能
- 基于Qt5.6做一个最简单的具有收发功能的串口助手
- Excel 若要使保存的文件具有这些功能,请单击否,然后从“文件类型”列表中选择一个启用宏的文件类型
- 设计一个具有GetMin功能的栈
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 用unity写的 定义一个车辆(Vehicle)基类,具有Run、Stop等方法,具有Speed(速度)、MaxSpeed(最大速度)、Weight(重量)等域。然后以该类为基类,派生出bicycl
- 一个网友写的栈,问为啥不能迭代。具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网
- Oracle查出一个用户具有的所有系统权限和对象权限
- Spark RDD编程(Python和Scala版本)----Spark中的RDD就是一个不可变的分布式对象集合,是一种具有兼容性的基于内存的集群计算抽象方法,Spark则是这个方法的抽象。 Spa
- 今天碰到的一个问题,关于通过基类对象的引用给子类赋值
- 实现一个具有百度文库文档转换功能的工具类
- cocos2dx封装一个具有Layout功能的Point类 (提供源码)
- 一个具有缓存数据功能的HttpWebRequest工具类
- 将IRepository接口进行抽象,使它成为数据基类的一个对象,这样每个子类都可以有自己的最基础的CURD了