原理:利用类中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