我阅读了第 04 项提到的有效 C++
通过用本地静态对象替换非本地静态对象来避免跨翻译单元的初始化顺序问题。
我认为“全局且只有一个对象”应该是单例模式,而不是我阅读此项目后的外部对象。
比如 I/O 对象(std::cout)
但 std::cout 似乎是外部对象。(http://www.cplusplus.com/reference/iostream/cout/)
我对此感到困惑。
编辑:添加代码
我从这本书中捕获了一些代码。
首先是糟糕的代码:
class FileSystem {
// from your library’s header file
public:
...std::size_t numDisks( ) const;
// one of many member functions...
};
extern FileSystem tfs;
在不同翻译单元中定义的非局部静态对象的相对初始化顺序是未定义的。
所以当我调用 tfs.
因为 tfs 可能没有完成初始化。
推荐代码:
class FileSystem { ... }; // as before
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
class Directory { ... };// as beforeDirectory::Directory( params )
Directory::Directory( params ) // as before, except references to tfs are
//now to tfs( )
{
...
std::size_t disks = tfs().numDisks( );
...
}
Directory& tempDir()
{
static Directory td(params);
return td;
}