您的位置:首页 > 其它

一个具有对象计数功能的基类

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;
}


  运行界面如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐