C ++ инициализация глобальных переменных - PullRequest
0 голосов
/ 08 марта 2012

В C ++, что было бы лучшим способом иметь объект, который должен быть инициализирован в main (), но должен быть глобальным, чтобы к нему можно было получить доступ из других функций в программе?И убедитесь, что деструктор вызван, чтобы убедиться, что он очищен должным образом?

Ответы [ 2 ]

4 голосов
/ 08 марта 2012
struct foo {};

foo *x_ptr;

int main() {
    foo x;
    x_ptr = &x;
    // the rest
}

Вы также можете использовать std::reference_wrapper, если не хотите получать доступ к участникам через operator->.

Но на самом деле, не делай этого. Передайте его, если это необходимо, вместо того, чтобы сделать его глобальным, например

void needs_foo1(foo&);
void needs_foo2(foo&, int, int, int); 

int main() {
    foo x;
    needs_foo1(x);
    needs_foo2(x, 1, 2, 3);
    // et cetera
}
3 голосов
/ 08 марта 2012

Я подозреваю, что "глобальный" - это решение, а не требование.Как и предполагалось, вы всегда можете явно передать свой объект.

Если вы не хотите этого делать, я бы, вероятно, использовал shared::ptr, возможно, заключенный в Синглтон реализация.Ваш shared_ptr будет инициализирован до null при запуске программы и установлен в допустимое значение в main().

Помните, что вы можете столкнуться с порядком проблем уничтожения, если у вас есть глобальные переменные, которые зависятдругие глобальные переменные.Существует также огромное количество литературы о недостатках паттернов синглтона.

...