我最近读到 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/