More Effective C++之26

原创 2006年06月21日 18:48:00
条款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下测试过,没有问题。我在原有基础上,在析构中,加入了对对象数量的递减。这样做为了将来对象引用计数打下基础。

《More Effective C++》读书笔记-技术

25、将构造函数和非成员函数虚化1、这里所谓的虚拟构造函数,并不是真的指在构造函数前面加上 virtual 修饰符,而是指能够根据传入不同的参数建立不同继承关系类型的对象。class NLCompon...
  • will130
  • will130
  • 2016年05月02日 12:27
  • 2794

《Effective C++》和《More Effective C++》汇总

More Effective C++读书笔记 条款1:指针与引用的区别 二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以;指针可以被重新赋值以指向另一个不同的对象,但...
  • zhu2695
  • zhu2695
  • 2013年06月22日 20:29
  • 2035

《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?

昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分...
  • hxz_qlh
  • hxz_qlh
  • 2013年10月26日 21:27
  • 6096

More Effective C++学习笔记(4)-效率

主题 概要 C++ More Effective C++ 效率 编辑 时间 新建 20170121 序号 参考资料 1 More ef...
  • shaozhenged
  • shaozhenged
  • 2017年01月21日 20:23
  • 404

more effective c++--引用计数

引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。这个技巧 有两个常用动机。第一个是简化跟踪堆中的对象的过程。一旦一个对象通过调用 new 被分配 出来,最要紧的就是记录谁拥有这个对象...
  • xdgs_2005
  • xdgs_2005
  • 2015年04月05日 14:22
  • 370

Effective C++: scott Meyers的几句话

前几天,慕名买了一本关于C++的一本书, 即Scott Mey
  • a130737
  • a130737
  • 2014年07月31日 13:21
  • 517

More Effective C++----技巧 & (25)将构造函数和非成员函数虚拟化

技巧 本书涉及的大多数内容都是编程的指导准则。这些准则虽是重要的,但是程序员不能单靠准则生活。有一个很早以前的卡通片叫做“菲利猫”(Felix the Cat), 菲利猫无论何时遇到困难,它都会拿...
  • qianqin_2014
  • qianqin_2014
  • 2016年05月06日 23:30
  • 2488

c++设计中可以利用重载避免隐式类型转换

首先,先看一个例子: class UPInt { public: UPInt(); UPInt(int value); ... } const UPInt operator +(cons...
  • qq_37185716
  • qq_37185716
  • 2017年08月05日 00:16
  • 98

利用重载避免隐式类型转换(More Effective C++_21(效率))

class UPInt { // unlimited precision  public: // integers 类  UPInt();  UPInt(int value);  ... };//有关...
  • zhangchen1003
  • zhangchen1003
  • 2015年09月05日 16:37
  • 225

至少应该阅读的九本C++著作(by 荣耀)

声明:本文系转载,据说是荣耀先生推荐的,但是找不到原文出处了。只有这个也是转载:http://phoenixzz.blogbus.com/logs/337332.html =============...
  • godenlove007
  • godenlove007
  • 2013年06月15日 15:41
  • 1077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++之26
举报原因:
原因补充:

(最多只允许输入30个字)