在阅读本书" 用Java思考"时,我找到了这一行
例如,如果一个静态期望另一个静态到,那么C ++就会出现问题 在第二个初始化之前有效
随后我试图通过以下code确认自己:
class A{
public:
static int x;
};
int A::x = B::y; //error 'B' has not been declared
class B{
public:
static int y;
};
int B::y = 10;
int main()
{
return 0;
}
我的问题是有没有办法克服这个问题。 Java通过在访问静态字段/方法时加载类代码来处理此问题。我们如何用C ++做到这一点?
答案 0 :(得分:2)
您必须在A::x
的定义之后放置B
的初始化,该B::y
必须是完整类型才能使用B::y
;在A::x
初始化之后,因为class B{
public:
static int y;
};
int B::y = 10;
class A{
public:
static int x;
};
int A::x = B::y;
已从中初始化。
e.g。
{{1}}
initialization order指定如下:
有序动态初始化,适用于所有其他非局部变量:在单个转换单元中,这些变量的初始化始终按照其定义出现在源代码中的确切顺序排序。不同翻译单元中的静态变量的初始化是不确定的。不同翻译单元中线程局部变量的初始化是没有顺序的。
答案 1 :(得分:0)
答案是否定的,您必须以正确的顺序初始化静态成员变量。
如果它们是const,您可以直接在类中初始化它们。