У меня есть программа на 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