C ++ статические глобальные объекты обходные пути? - PullRequest
2 голосов
/ 25 апреля 2009

У меня есть программа на C ++, которая вылетела из-за ошибки. Он даже не доберется до main, поскольку указатель 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 Ответ

3 голосов
/ 25 апреля 2009

Одним из способов управления созданием статических объектов является использование конструкции при первом использовании, как описано в этом FAQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...