2016-04-17 178 views
-4

我有另一个类中的类的静态变量。静态变量初始化 - 澄清

class1.h 

class1 
{ 
public: 
static class2 check; 
} 

class2.cpp 
class2 class1::check; 

现在class2.cpp具有以下默认构造函数

class2() 
{ 
    size = G_SIZE; //this G_SIZE is an extern variable, which gets initialized after main() is called. 
} 

由于静态初始化发生在外部变量初始化之前,我得到0初始化大小。我该如何处理?

编辑:不确定为什么它被downvoted。

+0

没有完全理解你 - 这里有什么问题? – TarmoPikaro

+0

class2默认构造函数在静态成员初始化过程中被调用,这发生在main调用之前。由于这个原因,size变量没有使用我想要的值(G_SIZE)进行初始化。由于G_SIZE只有在调用main()之后才能获得它的值。我如何通过正确的值来获得大小的初始化。 – user2761431

+0

''G_SIZE'在*'main'被调用之前被初始化,就像'class1 :: check'一样。如果变量是以不同的翻译单位定义的,则这些初始化的顺序是未指定的。 – molbdnilo

回答

1

你永远不应该有静态变量依赖于其他变量(尤其是其他静态变量)。但那正是你在做的。

第一个建议:不要这样做。寻找更好的设计。

下一个建议:如果你必须做到这一点(在这种情况下,肯定你没有),你可以用一个功能,这将延迟,直到运行时,当值,保证是你的访问建立。看到这里:What is the lifetime of a static variable in a C++ function?和这里:C++ static initialization order

0

通过告诉编译器'静态' - 你将最有可能得到该变量在mainCRTstartup期间初始化 - 这是在调用main之前。如果在main中执行变量初始化,其他数据初始化必须在此之后发生 - 您可以使用函数调用doInitialize(),它将执行“check”变量的初始化。

也可以在函数内部写入静态函数 - 然后在调用函数时静态被初始化 - 在初始化G_SIZE之后,您可以放置​​'static'。在命令或构造函数/析构函数中玩耍总是有点运气游戏(危险) - 为了保证构造函数和析构函数不被保证,并且有可能在初始化静态时命中未初始化的数据 - 仅仅因为另一个变量尚未初始化。

但有时甚至可能需要更改析构函数调用顺序。 -

FYI: 
http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI 
CrtDestroyStatics.