Я хочу добавить к ответу Южного гостеприимства
Статические переменные в C и C ++
следующие замечания:
Использование static
для обозначения "local to translation unit" не рекомендуется в C ++ (href = "https://rads.stackoverflow.com/amzn/click/com/0201700735" rel =" nofollow noreferrer "Язык программирования C ++: специальное издание, приложение B.2.3, устаревшие функции) .
Вместо этого следует использовать безымянные пространства имен:
static int reply = 42; // deprecated
namespace {
int reply1 = 42; // The C++ way
}
Как уже сказал Southern Hospitality, порядок инициализации глобальных объектов не определен. В этой ситуации вам следует рассмотреть возможность использования шаблона href = "http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B", Singleton.
UPDATE:
GMan прокомментировал мой ответ:
«Порядок определяется для каждой единицы перевода ...»: это действительно забило мне голову, поэтому я посмотрел его на языке программирования C ++.
В Разделе 9.4.1, Инициализация нелокальных переменных, профессор Страуструп предлагает, что «функция, возвращающая ссылку, является хорошей альтернативой глобальной переменной»:
int& use_count()
{
static int uc = 0;
return uc;
}
"Вызов use_count()
теперь действует как глобальная переменная, которая инициализируется при первом ее использовании. Например:"
void f()
{
std::cout << ++use_count() << '\n';
}
В моем понимании это очень похоже на паттерн Синглтона.
GMan прокомментировал далее: «Мы должны ограничить нашу способность создавать эти объекты одним и предоставлять глобальный доступ к ним». Действительно ли ограничение одного связано с чем-то в этой проблеме? Нам может понадобиться глобально, но кто скажет, что мы не хотим его в других местах? "
Некоторые цитаты из синглтона (127) (Gamma et al, Design Patterns):
«Шаблон Singleton является улучшением по сравнению с глобальными переменными. Он не допускает загрязнения пространства имен глобальными переменными, в которых хранятся отдельные экземпляры.»
«Шаблон позволяет легко передумать и разрешить более одного экземпляра класса Singleton».
Синглтоны инициализируются в порядке их первого использования.
В Herb Sutter, Андрей Александреску, Стандарты кодирования C ++, пункт 10 гласит:
"Избегайте общих данных, особенно глобальных данных."
Поэтому я часто использую Singletons, чтобы избежать глобальных данных. Но, конечно, поскольку все слишком много, это может быть чрезмерное использование шаблона Singleton. (Джошуа Кериевский называет это «синглтонитом» в своей книге «Рефакторинг на паттерны».)
ОБНОВЛЕНИЕ 2:
(Извините, но я не могу писать комментарии, поэтому это обновление.)
Джальф написал в своем комментарии: «Бригада из четырех человек курила что-то нелегальное, когда писала о схеме синглтона».
Очевидно, что другие разработчики C ++ тоже курили интересные вещества. Например, Херб Саттер (он более десяти лет работал секретарем и председателем комитета по стандартам ISO C ++ во время разработки второго стандарта C ++, C ++ 0x, и в качестве ведущего архитектора C ++ / CLI в Microsoft. В настоящее время Херб разработчик модели памяти Prism для платформ Microsoft и расширений Concur для Visual C ++ для параллельного программирования), написанный в C ++ Стандарты кодирования, пункт 21:
"Когда вам нужна такая (на уровне пространства имен) переменная, которая может зависеть от другой, рассмотрите шаблон проектирования Singleton; при осторожном использовании он может избежать неявных зависимостей, гарантируя, что объект инициализируется при первом доступе. Тем не менее, Singleton является глобальная переменная в овечьей шкуре и нарушается взаимными или циклическими зависимостями. "
Итак, избегайте глобальных данных, если можете. Но если вам нужно использовать глобальные данные в отдельных единицах перевода, Singleton должен быть приемлемым решением для обеспечения определенной последовательности инициализации.
Обратите внимание, что в языке Java глобальные данные даже не существуют. Очевидно, что глобальные данные заменяются / эмулируются с помощью шаблона проектирования Singleton.
(Поскольку я работаю в своей дневной работе с командой Java, я стремлюсь к максимальному сходству моих программ на C ++ с программами Java. Например, каждый класс находится в своем собственном исходном файле / модуле перевода.)