Я работаю над проектом 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.
Я полагаю, вы говорите о нетривиальных инициализация глобальных переменных (или статических переменных), таких как (на верхнем уровне файла):
MyObject *myPtrObject = new MyObject(42, "blah");
MyObject myOtherObject;
(«тривиальная» инициализация — это, грубо говоря, когда не задействован конструктор, а все просто включает константы; поэтому, если вы инициализируете указатель на ноль, он будет равен нулю, прежде чем любой код будет фактически вызван)
Порядок инициализации между различными исходными файлами НЕ ГАРАНТИРОВАНО в C ++. Это зависит от порядка файлов в текущей системе Apple, но ЭТО МОЖЕТ ИЗМЕНИТЬСЯ.
Так что да, здесь что-то в корне не так.
Ничего не зная о вашей программе, конечно, сложно дать более конкретные рекомендации по дизайну.
Других решений пока нет …