参考<
代码如下:
#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;
}
运行界面如下:
原文链接: https://www.cnblogs.com/venow/archive/2012/10/17/2728431.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/66098
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!