限制堆上的对象实例化

时间:2017-04-20 17:17:33

标签: c++

"更有效的C ++"的第26项,解释了限制实例化类的对象数量的方法,例如

class Printer {
public:
 class TooManyObjects{};
 static Printer* makePrinter();
~Printer();
 void submitJob(const PrintJob& job);
 void reset();
 void performSelfTest();
 ...
private:
 static size_t numObjects;
 Printer();
 Printer(const Printer& rhs);
};

size_t Printer::numObjects = 0;

Printer::Printer()
{
 if (numObjects >= 1) {
 throw TooManyObjects();
 }
 //proceed with normal object construction here;
 ++numObjects;
}

Printer* Printer::makePrinter()
{ 
    return new Printer;
}

不检查已创建的对象数量

 if (numObjects >= 1) {
     throw TooManyObjects();
 }

最好放在成员函数Printer :: makePrinter()中而不是在类构造函数中,这样如果不允许创建更多对象,我们就不会自己分配内存?或者,通过将此检查放入我缺少的类构造函数中,我们获得了什么?

1 个答案:

答案 0 :(得分:-1)

你是对的,没有为一个无法构造的对象分配内存效率更高。

然而,在第26项“更有效的C ++”中,Scott Meyers首先建议使用公共默认构造函数:

class Printer {
public:
 class TooManyObjects{}; // exception class for use
 // when too many objects
 // are requested
 Printer();
 ~Printer();
 ...
private:
 static size_t numObjects;
 Printer(const Printer& rhs); // there is a limit of 1
 // printer, so never allow
}; 

Printer::Printer()
{
 if (numObjects >= 1) {
 throw TooManyObjects();
 }
 proceed with normal construction here;
 ++numObjects;
}

在这种情况下,检查构造函数中的实例数更有意义,因为构造函数是公共的,任何人都可以调用它。

接下来的建议是你提出的问题,他将构造函数移动到类的私有部分。由于内存分配的效率不在该项的范围内,因此他可能没有考虑将实例计数检查移动到工厂方法。