影响C ++中的初始化顺序

时间:2018-05-21 09:54:17

标签: c++ compiler-errors static initialization

在阅读本书" 用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 ++做到这一点?

2 个答案:

答案 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,您可以直接在类中初始化它们。