在C ++中,如果以不同翻译单元定义了相互依赖的静态对象,则该语言本身无法保证初始化的顺序。
Bruce Eckel给出了一个示例(“在C ++中思考”):
第一个文件定义了一个名为ofstream
的{{1}}对象:
out
第二个文件对//: C10:Out.cpp {O}
// (c) Bruce Eckel 2000
// First file
#include <fstream>
std::ofstream out("out.txt"); ///:~
对象有依赖性:
ofstream
在构建并链接这2个文件以创建可执行文件时,仅当第一个文件在第二个文件之前被初始化时,exe才起作用。否则程序将崩溃。
Eckel提供了两种解决方案。
第一个解决方案涉及一种技术(由Jerry Schwarz开创),并在库头文件中使用Initializer类。 Initializer类负责库的静态对象的动态初始化。
Eckel提供了一个示例,该示例动态初始化2个内置类型的静态全局变量。
基本技术对我来说很清楚。
然后他进入状态:
此示例使用内置类型作为全局静态对象。该技术还适用于类,但是必须由Initializer类动态初始化这些对象。一种方法是创建没有构造函数和析构函数的类,而是使用不同名称的初始化和清除成员函数来创建类。但是,更常见的方法是具有指向对象的指针,并使用new Initializer()来创建它们。
关于Eckel的陈述,我有以下查询:
1)为什么需要创建没有构造函数和析构函数的类,而是使用不同名称的初始化和清除成员函数来创建类?
2)如何使用使用指向对象的指针的方法?
3)示例将有很大帮助。