Я написал довольно обширную структуру, которая управляет персонажами в физической симуляции. Хотя все предупреждали меня не делать этого, я использовал глобальную публичную структуру данных для хранения информации и назвал ее State. Это также не в пространстве имен. Я делаю это глобально доступным, провозглашая внешнее состояние государства ;. Причина, по которой я это сделал, заключается в том, что эта структура нужна везде в приложении, и я нахожу чрезвычайно удобным просто включить мой State.h, а затем записать в state.var где угодно и прочитать state.var где угодно. Каркас также быстро меняется, и я также чувствую себя комфортно, не заботясь о передаче данных, синхронизации и т. Д. При внедрении новых компонентов.
Так или иначе, теперь s *** поразил поклонника. Я хочу использовать один из классов Qt GUI, и у него уже есть свой собственный член, называемый состоянием типа State. Их состояние, по крайней мере, находится в пространстве имен, но, похоже, это не имеет значения, поскольку внутри класса я уже использую это пространство имен.
Что я могу сделать сейчас?
Я наверное не понимаю проблемы, но что вам мешает делать
::state.var
?
гладкий ::
означает глобальное пространство имен, и хотя использование глобальных символов имеет хорошо известные проблемы, а глобальные переменные также имеют свой собственный набор проблем (как правило, в коде C ++, вместо них используются синглтоны), нет ничего волшебного в использовании глобальной переменной в глобальном пространстве имен , ::errno
Пример такой переменной, связанной практически со всеми приложениями на Си и Си ++ на Unix-подобных платформах.
Ваш единственный выбор — вырвать ваш глобальный и заменить его чем-то вменяемым. Это очень больно, но у вас действительно нет другого выбора. Вот почему люди рекомендуют не использовать его в первую очередь.
Короче, поздравляю с усвоением урока — не используйте глобальные переменные.
Ну, есть простая альтернатива:
extern State state;
State& mystate = state;
namespace qt {
class State;
class Gui {
public:
void foo() {
mystate.var = 3;
}
private:
State* state;
};
}
… но есть и то, что называется Технический долг, и вы занимаетесь глубоко.