C++中与Java的静态块(static block)等效的惯用法是什么?
C++中与Java的静态块(static block)等效的惯用法是什么?
我有一个类,其中包含一些静态成员,并且我想运行一些代码来初始化它们(假设这些代码无法转换为简单表达式)。在Java中,我只需这样做:
class MyClass { static int field1; static int field2; static { /* 执行一些计算,设置 field1 和 field2 的值 */ } }
除非我弄错了,C++不允许这样的静态代码块,对吗?我应该做些什么呢?
我希望有两个选项的解决方案:
- 在进程加载时发生初始化(或者在加载包含该类的DLL时)。
- 在首次实例化类时发生初始化。
对于第二个选项,我考虑过:
class StaticInitialized { static bool staticsInitialized; virtual void initializeStatics(); StaticInitialized() { if (!staticsInitialized) { initializeStatics(); staticsInitialized = true; } } }; class MyClass : private StaticInitialized { static int field1; static int field2; void initializeStatics() { /* 执行一些计算,设置 field1 和 field2 的值 */ } };
但这是不可能的,因为C++(目前)不允许非常量静态成员的初始化。但至少这将问题从静态块减少到静态初始化的问题,可以通过表达式来解决...