李永亮的专栏

设计改变中国!

More Effective C++之26

条款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下测试过,没有问题。我在原有基础上,在析构中,加入了对对象数量的递减。这样做为了将来对象引用计数打下基础。
阅读更多
个人分类: 读书笔记
上一篇Effective STL目录
下一篇More Effective C++之27
想对作者说点什么? 我来说一句

More Effective C++.pdf 高清 目录

2014年02月11日 2.48MB 下载

C++effectiveC++more effective

2016年02月24日 17.73MB 下载

没有更多推荐了,返回首页

关闭
关闭