首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > More Effective C++之26
【标  题】:More Effective C++之26
【关键字】:More,Effective,C++
【来  源】:http://blog.csdn.net/hanyu1980/archive/2006/06/21/819187.aspx

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下测试过,没有问题。我在原有基础上,在析构中,加入了对对象数量的递减。这样做为了将来对象引用计数打下基础。
C/C++ 语言中结构体的内存分配:【上一篇】
面试问题之 按单词反转字符串:【下一篇】
【相关文章】
  • C/C++ 语言中结构体的内存分配
  • 打造自己的专业图像工具-Visual C++ 2005图像编程系列【二】
  • 关于ASSERT(断言)使用的规则--摘自《高质量C/C++编程指南》
  • c++常用技巧集
  • 用C实现C++的多态---剖析GTK的"对象" (三)
  • 用C实现C++的多态---剖析GTK的"对象" (四)
  • 一个C++的万年历类
  • c/c++/c#
  • 在win32 api程序中:使用C++风格的字符串
  • C++非面向对象的特征
  • 【随机文章】
  • session 警告问题
  • openview
  • 十类"常用"密码千万不能用
  • OCI SQLT_DAT注意的问题
  • JS部分通用函数
  • NSA与Vista
  • JSP高级编程(12)
  • 嵌入式软件.测试.危机的趋势和对策---关注品质,开发软件(4)
  • 集线器的安装与连接
  • 封闭开发是为何?
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.