条款26:限制某个class所能产生的对象数量
允许零个或者一个对象
零个,很简单,将对象的构造函数私有化。一个,也很简单,Singleton模式。我前面也有Blog对局部静态对象进行了探讨。
不同对象的构造状态
对象的存在有三种状态,(1)对象自己(2)存在于派生类对象中(3)作为成员对象存在于某个更大的对象中。我们通常做这样的限制的时候,通常这样做
class A
{
private:
A(){}
A(const A&){}
public:
static A* MakeA(){return new A();}
static A* MakeA(const A& a){return new A(a);}
};
为了避免资源泄漏,通常可以把这样的对象放在智能指针中。
允许对象生生灭灭
当多于一个对象的时候,可以在MakeA()中作一个限制,如果超过某一个数量返回NULL或者抛出异常。
class A
{
private:
A(){}
A(const A&){}
~A(){--numObjects ;}
static size_t numObjects;
static const size_t maxObjects;
public:
static A* MakeA()
{
if(numObjects >= maxObjects)
return NULL;
else
{
++numObjects;
return new A();
}
}
static A* MakeA(const A& a)
{
if(numObjects >= maxObjects)
return NULL;
else
{
++numObjects;
return new A(a);
}
}
};
size_t A::numObjects = 0;
const size_t A::maxObjects = 10;
一个用来计算对象个数的Base Class
考虑如下代码:
template <classBeingCounted>
classCCounted
{
public:
classTooManyOjects{};
staticintObjectCount(){returnnumberObjects;}
protected:
CCounted(){init();}
CCounted(constCCounted& rhs){init();}
virtual ~CCounted(){--numberObjects;}
private:
staticconstintmaxObjects;
staticintnumberObjects;
voidinit()
{
if (numberObjects >= maxObjects)
throwTooManyOjects();
++numberObjects;
}
};
template<classBeingCounted>
intCCounted<BeingCounted>::numberObjects = 0;
template<classBeingCounted>
constintCCounted<BeingCounted>::maxObjects = 10;
classPrinter:privateCCounted<Printer>
{
public:
staticPrinter* makePrinter(){returnnewPrinter;}
staticPrinter* makePrinter(constPrinter& rhs){returnnewPrinter(rhs);}
virtual ~Printer(){}
usingCCounted<Printer>::ObjectCount;
private:
Printer(){}
Printer(constPrinter&){}
};
以下代码,我在VC6下测试过,没有问题。我在原有基础上,在析构中,加入了对对象数量的递减。这样做为了将来对象引用计数打下基础。