C ++ глобальная структура создает конфликт имен

Я написал довольно обширную структуру, которая управляет персонажами в физической симуляции. Хотя все предупреждали меня не делать этого, я использовал глобальную публичную структуру данных для хранения информации и назвал ее State. Это также не в пространстве имен. Я делаю это глобально доступным, провозглашая внешнее состояние государства ;. Причина, по которой я это сделал, заключается в том, что эта структура нужна везде в приложении, и я нахожу чрезвычайно удобным просто включить мой State.h, а затем записать в state.var где угодно и прочитать state.var где угодно. Каркас также быстро меняется, и я также чувствую себя комфортно, не заботясь о передаче данных, синхронизации и т. Д. При внедрении новых компонентов.

Так или иначе, теперь s *** поразил поклонника. Я хочу использовать один из классов Qt GUI, и у него уже есть свой собственный член, называемый состоянием типа State. Их состояние, по крайней мере, находится в пространстве имен, но, похоже, это не имеет значения, поскольку внутри класса я уже использую это пространство имен.

Что я могу сделать сейчас?

4

Решение

Я наверное не понимаю проблемы, но что вам мешает делать

::state.var

?

гладкий :: означает глобальное пространство имен, и хотя использование глобальных символов имеет хорошо известные проблемы, а глобальные переменные также имеют свой собственный набор проблем (как правило, в коде C ++, вместо них используются синглтоны), нет ничего волшебного в использовании глобальной переменной в глобальном пространстве имен , ::errno Пример такой переменной, связанной практически со всеми приложениями на Си и Си ++ на Unix-подобных платформах.

5

Другие решения

Ваш единственный выбор — вырвать ваш глобальный и заменить его чем-то вменяемым. Это очень больно, но у вас действительно нет другого выбора. Вот почему люди рекомендуют не использовать его в первую очередь.

Короче, поздравляю с усвоением урока — не используйте глобальные переменные.

6

Ну, есть простая альтернатива:

extern State state;
State& mystate = state;

namespace qt {
class State;

class Gui {
public:
void foo() {
mystate.var = 3;
}

private:
State* state;
};
}

… но есть и то, что называется Технический долг, и вы занимаетесь глубоко.

2