Это не то, что глобальные переменные являются плохими. Они не являются ни хорошими, ни плохими, но как инструмент, они полезны, когда они служат своей цели. Поскольку этот конкретный инструмент, как правило, подвергается насилию, существует общее понятие «глобальные переменные - это плохо, ooooggggh». Тем не менее, везде есть глобальные переменные. Например, std::cout
часто является глобальной переменной.
Однако определенные сценарии требуют глобальных переменных. Но, прочитав, что «они плохие», люди начинают использовать что-то другое - обычно Singletons. Синглтоны не лучше глобальных переменных, за исключением ленивой итализации, но многие синглтоны даже не используют ленивую инициализацию. В результате этого подхода каждая глобальная переменная превращается в Singleton (к счастью, она уже поддерживается многими библиотеками, а превращение глобального в singleton занимает не более нескольких нажатий клавиш), и такое же злоупотребление продолжается.
Вместо повторения мантры «глобальные переменные являются плохими» разработчики должны понимать, какие проблемы связаны с ними, каковы их преимущества и выбрать инструмент, который соответствует конкретной потребности в кодировании.
Глобальные переменные делают рассуждения о коде жесткими. Это означает, что, поскольку любая функция может записать в нее значение, трудно понять, как изменяется значение по сравнению с выполнением программы.Если, например, вы понимаете, что значение в какой-то момент неверно, у вас будет время выяснить, как вы оказались там. В худшем случае вам нужно будет grep всей кодовой базы для имени этой переменной, что будет забавно, если кодбаза - 1000 файлов, а имя - что-то вроде i
.
Я не буду говорить вам, что использовать в вашем случае. Уже есть предложения: сделать его статической переменной класса или сделать его локальной переменной для данного .cpp-файла. Оба они хороши, поскольку они ограничивают область потенциальных переменных смены переменных - друзьям класса или функциям, определенным в том же файле .cpp. Принимая классовый подход, вы можете иметь функции и данные как статические члены класса - таким образом вам не нужно определять друзей. Твой выбор.
делают функции статическими методами класса. –
, в то время как вы используете C++ amke для использования класса и друга. – Sigstop
Почему бы не сделать карту членом класса с функциями, являющимися членами? – Pixelchemist