引自《More Effective C++》,其实与设计模式里的单利模式比较类似,但也有不同。
相同点:都能够限制类生产对象的个数。
不同点:《More Effective C++》限制对象个数可以限制为任意个,可以实现删除与增加,而且扩展了基类;设计模式里单利模式对象始终为那一个,生成了就会生存到整个程序运行完毕,中间占据的始终是那一块内存。
1 不使用基类,限制类的实例个数
先贴代码:
#include<iostream>
#include<exception>
using namespace std;
class Printer
{
public:
static Printer* makePrinter(int x = 0);
static Printer* makePrinter(const Printer& rhs);
void print();
~Printer();
private:
class TooManyObjects;
static const int maxSize;
static int num;
Printer(int x);
Printer(const Printer& rhs);
int x;
};
const int Printer::maxSize = 3;
int Printer::num = 0;
class Printer::TooManyObjects : public exception
{
const char* what()
{
return "超过类最大实例个数";
}
};
Printer::Printer(int x)
{
if (num >= maxSize)
throw TooManyObjects();
this->x = x;
num++;
}
Printer::Printer(const Printer& rhs)
{
if (num >= maxSize)
throw TooManyObjects();
num++;//建立p4时,这里会引发“未处理的异常”错误,为甚么?
this->x = rhs.x;
}
Printer* Printer::makePrinter(int x)
{
try
{
return new Printer(x);
}
catch (exception* e)
{
e->what();
}
}
Printer* Printer::makePrinter(const Printer& rhs)
{
try
{
return new Printer(rhs);
}
catch (exception* e)
{
e->what();
}
}
void Printer::print()
{
cout << x << endl;
}
Printer::~Printer()
{
num--;
}
int main()
{
Printer *p1 = Printer::makePrinter(5);
Printer *p2 = Printer::makePrinter();
Printer *p3 = Printer::makePrinter(*p2);
p1->print();
p2->print();
p3->print();
//Printer *p4 = Printer::makePrinter(*p2);//会引发未处理的异常
//p4->print();
system("pause");
return 0;
}