条款M26:限制某个类所能产生的对象数量(2):一定个数对象

原理:利用类中static变量统计已生成对象个数。
例子:

//.h
class Printer { 
public: 
  class TooManyObjects{};  //用于抛出异常
  // 伪构造函数 
  static Printer * makePrinter();  //用于构造对象
  static Printer * makePrinter(const Printer& rhs);   //用于构造对象
  ~Counted() { --numObjects; } //析构负责减少个数,构造的堆内存用智能指针销毁
  static int objectCount() { return numObjects; } //返回现有个数
  ...  
private: 
  static size_t numObjects;  //现有个数
  static const size_t maxObjects = 10;       // 个数限制为10
  Printer();  //私有构造函数
  Printer(const Printer& rhs);  //私有复制构造函数
};

//.cpp
size_t Printer::numObjects = 0;  //现有个数为0
const size_t Printer::numObjects; //静态变量定义
Printer::Printer() 
{ 
  if (numObjects >= maxObjects) { 
    throw TooManyObjects();  
  }  
  // 继续运行正常的构造函数;  
  ...  //正常构造
  ++numObjects;
}  
Printer::Printer(const Printer& rhs) 
{ 
  if (numObjects >= maxObjects) { 
    throw TooManyObjects(); 
  }  
  // 继续运行正常复制构造函数;  
  ...  //正常构造
  ++numObjects;
}
Printer * Printer::makePrinter() 
{ return new Printer; }  
Printer * Printer::makePrinter(const Printer& rhs) 
{ return new Printer(rhs); }

//.cpp
unique_ptr<Printer> pt1(Printer::makePrinter());
unique_ptr<Printer> pt2(Printer::makePrinter(pt1));

过程: 在构造函数中通过static变量判断已有的对象个数,不超过限制则继续构造,超过则抛出异常。

可以定义统计对象个数的基类,然后需要的类继承其进行使用,具体见书More Effective C++ 条款26。

参考资料:More Effective C++ 条款26

总结:

1、类中static变量可用于统计类对象个数
2、对于静态变量(除const静态成员外),类定义内部的那个叫引用性声明(即使可以类内写初始化代码)。其与类是一个级别的,因此类中静态变量必须在类外定义,与全局变量一样存储静态区。

3、使用智能指针负责销毁类对象,可以取消析构函数中delete

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值