c++ - 用于更改静态成员初始化行为的简洁语法

标签 c++ static initialization

我最近读到 Java 现在支持如下初始化 block :

class C {

    public C() { /* Instance Construction */ }
    static { /* Static Initialisation */ }
    { /* Instance Initialisation */ }

}

我对 static block 特别感兴趣。它让我想到了影响许多 C++ 新手用户的静态初始化顺序问题,以及它的典型解决方法,例如将静态成员包装在一个自由函数中,或者使用 GNU 的 __attribute__((init_priority(n))) 扩展。

我正在寻找一些方法来编写一个方法,该方法将自动调用以初始化类的静态成员,无论是在创建第一个实例时还是在程序开始时,在普通静态初始化期间。

到目前为止,这是我想到的最好的:

class C {
private:

    class Static {
    public:

        Static();

        int i;
        Foo foo;

    };

public:

    static Static statics;

    // ...

};

C::Static::Static() : i(42), foo("bar") {}

也就是说,将所有静态成员包装在一个类中,并创建该类的静态实例,其构造函数用作静态初始化函数。很容易将其更改为仅在创建实例时实例化 statics 成员,甚至确保正确销毁静态成员。

当然,这个问题是 C::foo 变成了 C::statics.foo,这是相当不自然的。有没有办法绕过笨拙的语法,或者是否有更好的解决方案?

最佳答案

在大多数情况下,对我来说似乎不值得付出努力。你真的没有提高可读性,不寻常的结构会让 future 维护你的代码的程序员感到困惑,新类的添加增加了复杂性,从而使你面临更多错误的可能性。

我可以看出您很少需要或想要控制静态初始化的顺序,或者出于某些其他原因将所有静态包装起来。但从可读性的角度来看,我更喜欢经过验证的:

class C
{
private:
  static int i;
  static Foo foo;
};

int C::i = 42;
Foo C::foo("bar");

如果您有很多这样的静态数据,为什么不将它们全部发送到自己的 CPP 文件中呢?但是话又说回来,如果你真的有那么多静力学,我怀疑一开始是不是整体设计出了什么问题……

关于c++ - 用于更改静态成员初始化行为的简洁语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531532/

相关文章:

C++ Armadillo : double for loop using iterators

c++ - 是否通过使用数字文字调用函数来创建临时对象?

c - 在 c 中初始化整数指针,不会导致预期的未指定行为

opengl - 为什么程序员在OpenGL中使用常量和静态变量?

java - Java静态属性会影响性能吗?

cocoa-touch - 为什么-init是实例方法而+initialize是类方法?

c++ - 由于某些 python 错误,arm-none-eabi-gdb 无法启动

c++ - 应该如何以 C++11 风格初始化这个成员 vector ?

c++ - 这行代码是如何工作的?

由静态数据字段引起的消费者文件中的 C++ 错误链接