【发布时间】:2015-07-31 02:32:05
【问题描述】:
我长期使用 Java,并且对 C++ 比较陌生。因此,在 Java 中,如果在类级别有一些复杂的静态对象(在 Java 中一切都在类级别),我们可以简单地使用静态块来初始化它。例如
public class MyClass extends MyBase {
public static final Map<String, AComplexClass> STATIC_MAP = new HashMap<String, AComplexClass> ();
static {
AComplexClass first = ComplexClassFactory.createComplexType1();
first.configure("Something", "Something");
STATIC_MAP.put("key1", first);
// do some more
}
}
但是考虑到初始化 C++ 静态变量的限制,如果我想定义相同的 STATIC_MAP,这可能太复杂了,这似乎我需要在 .cpp 文件中为每个 AComplexClass 对象命名变量,然后放到地图上,在代码中产生了相当多的垃圾,也有机会让其他类不小心引用它们。
那么,C++ 等价于这种静态初始化逻辑的最佳实践是什么?我认为这是使用相同的策略,但可能是其他一些风格。
【问题讨论】:
-
但是考虑到初始化 C++ 静态变量的限制,你在说什么限制?
-
请注意,任何初始化的静态变量都将在 main() 运行之前完成。如果存在错误或竞争条件,则可能很难追踪。
-
只需使用控制反转,让您的应用程序生命周期管理复杂对象的创建和销毁。这可以应用于 java 和 c++ 并且您不需要在两种语言之间更改模式并且具有更好的可测试性。