C++中与Java的静态块(static block)等效的惯用法是什么?

22 浏览
0 Comments

C++中与Java的静态块(static block)等效的惯用法是什么?

我有一个类,其中包含一些静态成员,并且我想运行一些代码来初始化它们(假设这些代码无法转换为简单表达式)。在Java中,我只需这样做:

class MyClass {
    static int field1;
    static int field2;
    static {
        /* 执行一些计算,设置 field1 和 field2 的值 */
    }
}

除非我弄错了,C++不允许这样的静态代码块,对吗?我应该做些什么呢?

我希望有两个选项的解决方案:

  1. 在进程加载时发生初始化(或者在加载包含该类的DLL时)。
  2. 在首次实例化类时发生初始化。

对于第二个选项,我考虑过:

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++(目前)不允许非常量静态成员的初始化。但至少这将问题从静态块减少到静态初始化的问题,可以通过表达式来解决...

0