C ++静态全局对象的解决方法?

时间:2009-04-25 18:07:59

标签: c++ global-variables

我有一个由于bug而崩溃的C ++程序。它甚至不会到达main,因为在其静态全局对象的一个​​构造函数中访问了一个NULL指针。更糟糕的是,指针是NULL,但应该由另一个全局静态变量设置。我想我可以将这些全局变量包装在一个设置对象全局指针的函数中。我知道需要重新设计全局变量。我也知道全局静态对象的顺序是未知的。我仍然很好奇 - 有一个很好的接受方法来控制静态全局对象初始化的顺序吗?

简化示例(删除错误检查记录等)

[game.cpp]

Point UpperLeft(-1024.1024); //Global Evilness

int InitializeGobals()
{
   ...
}


int main (int argc, char ** argv)
{
     if (!InitializeGame())
        Die("Initialization Failure");

     WriteHighScore(UpperLeft);
}

我想使用以下命令指定所有静态对象:

[prposedgame.cpp]

Point *UpperLeft;
int InitializeGobals()
{
   Point IGUpperLeft = new Point(-1024.1024); 
   UpperLeft = &IGUpperLeft; 

   ...
}

int main (int argc, char ** argv)
{
     if (!InitializeGame())
        Die("Initialization Failure");
     WriteHighScore(UpperLeft);
}

[并非真正相关但可能有助于理解问题]

[Point.cpp]

Point::Point() {  
    x = 0;
    y = 0;
}

Point::Point(int nx, int ny) {  
    x = nx;
    y = ny;
    strcpy(text,0);  //0 should have been set by another global static object
}

[Point.h]

#ifndef POINT_H
#define POINT_H
class Point {
    public:
        Point();  
        Point(int nx, int ny); 
        int getX();
        int getY();
        int getText(*pcbuff);
    private:
        int x;
        int y;
        char text[2];
};
#endif

1 个答案:

答案 0 :(得分:3)

控制静态对象实例化的一种方法是在第一次使用习语上使用构造,如本FAQ中所述