Это плохая практика, если мне нужно организовать источники компиляции

Я работаю над проектом C ++ в Xcode, и один из моих файлов .cpp создает некоторые переменные. Другой файл .cpp в приложении использует эти переменные для создания экземпляров другого объекта и требует их создания, чтобы не вызывать исключение нулевого указателя. До сих пор я решил просто перетащить (простота XCode) первый файл поверх второго в порядке фазы сборки. Теперь он работает нормально, но у меня есть ощущение, что это не оптимальное решение, и что в моем коде есть что-то принципиально неправильное, если мне нужно организовать порядок компиляции вручную для правильной работы приложения.

Должен ли я никогда не создавать что-то вне функций или каково золотое правило? Благодарю.

РЕДАКТИРОВАТЬ: пример в соответствии с просьбой.
Проблема заключается в системе Observer / Event.
В исходном файле я делаю это:

Trigger* mainMenu_init = new Trigger(std::vector<Event*> {
// Event(s):
event_gameInit,

}, [](Event* e) {
// Action(s):
std::cout << "Hello World" << std::endl;

});

В конструкторе триггера Событие предлагается добавить в качестве наблюдателя:

for(Event* event : events)
event->addObserver(this);

НО, события являются просто внешними указателями, поэтому, если они не инициализированы (что они находятся в другом исходном файле), эта инициализация завершится неудачно. Поэтому я обнаружил, что если я не организую фазу компиляции самостоятельно, случайные триггеры не будут работать, в то время как другие будут работать, в зависимости от того, были ли они созданы до или после файла Event.cpp.

0

Решение

Я полагаю, вы говорите о нетривиальных инициализация глобальных переменных (или статических переменных), таких как (на верхнем уровне файла):

MyObject *myPtrObject = new MyObject(42, "blah");
MyObject myOtherObject;

(«тривиальная» инициализация — это, грубо говоря, когда не задействован конструктор, а все просто включает константы; поэтому, если вы инициализируете указатель на ноль, он будет равен нулю, прежде чем любой код будет фактически вызван)

Порядок инициализации между различными исходными файлами НЕ ГАРАНТИРОВАНО в C ++. Это зависит от порядка файлов в текущей системе Apple, но ЭТО МОЖЕТ ИЗМЕНИТЬСЯ.

Так что да, здесь что-то в корне не так.

Золотые правила

  • ВАЖНЫЙ: При инициализации глобального объекта не используйте другие глобальные объекты из разных исходных файлов.
  • Не злоупотребляйте глобальными переменными. Они имеют многочисленные недостатки с точки зрения разработки программного обеспечения.
  • Сделайте инициализацию глобальных объектов простой. Это облегчит соблюдение первого правила.

Ничего не зная о вашей программе, конечно, сложно дать более конкретные рекомендации по дизайну.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]