一个具有对象计数功能的基类
参考<<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; }
运行界面如下: