Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 限制堆上的对象实例化_C++ - Fatal编程技术网

C++ 限制堆上的对象实例化

C++ 限制堆上的对象实例化,c++,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;

“更有效的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()中,而不是放在类构造函数中,这样,如果不允许创建更多的对象,我们就不会分配内存了?或者,通过在类构造函数中加入这个检查,我们是否获得了我所缺少的东西?

您是对的,因为不为无法构造的对象分配内存更有效

但是,在第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;
}
在这种情况下,检查构造函数中的实例数更有意义,因为构造函数是公共的,任何人都可以调用它


下一个建议是您询问的建议,他将构造函数移动到类的私有部分。由于内存分配的效率不在该项的范围内,他可能没有考虑将实例计数检查移动到factory方法。

在本文中,他似乎说可以让factory函数进行检查并返回null,或者让构造函数抛出。很明显他对这两种方式都很满意。构造函数抛出是正常的,因为这会触发安全清理,并且因为它们没有返回类型。