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;
 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 首先建议使用公共(public)默认构造函数:

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;
}

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

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

关于c++ - 限制堆上的对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525940/

相关文章:

c# - 如何 : Monitoring file access by another process in Windows?

c++私有(private)属性可以在构造函数中使用,但在其他方法中会出现段错误

c++ - 在 C++(WinAPI 或 QT)中打印文本和图像

c++ - 如何同步QNetworkAccessManager?

c++ - 进程是否在退出时自动清理 pthreads 占用的资源

c++ - 处理 PVP 游戏中的延迟问题

c++ - 我的 C++ 模拟器使终端崩溃

c++ - 理解 char array[] 和 string

c++ - 我可以将 zlib 的 z_stream 重复用于多个操作吗?

c++ - 在通知期间注册/注销观察者时如何避免死锁?