Эти классы находятся в отдельных модулях. . Модуль Events содержит класс EventManager, модуль States содержит класс StateManager и связанные с ним классы, класс Window находится в отдельном модуле Window и т. д.
Всегда бывают случаи, когда одной из этих систем требуется доступ к некоторым функциям или состоянию одной из других систем (например, StateManager может сообщить EventManager , что текущий StateType изменился). Чтобы обеспечить такой доступ и обмен между всеми этими различными системами, во времена «до модулей» я использовал легкий объект SharedContext, который просто содержал несколько указателей на все соответствующие классы:
Код: Выделить всё
#pragma once
class Window;
class EventManager;
class TextureManager;
class GUI_Manager;
struct SharedContext{
Window* m_window = nullptr;
EventManager* m_eventManager = nullptr;
TextureManager* m_textureManager = nullptr;
GUI_Manager* m_gui_manager = nullptr;
};
Этот подход несовместим с модулями вообще. Основная проблема заключается в том, что мне не разрешено объявлять имя класса после того, как оно было объявлено в модуле. Таким образом, предварительные объявления здесь неправильно сформированы, и код не будет компилироваться, поскольку все заранее объявленные классы уже существуют в модулях.
Код: Выделить всё
SharedContext
Следующий минимальный пример жалуется с ошибкой при использовании GCC 14.2:
"ошибка: ссылка на EventManager неоднозначна"; примечание: кандидаты: «класс EventManager@SharedContext» ... примечание: «класс EventManager@Events»
SharedContext.cppm
Код: Выделить всё
export module SharedContext;
export class EventManager;
export struct SharedContext{
EventManager* m_eventManager = nullptr;
};
Код: Выделить всё
export module Events;
export class EventManager{
};
Код: Выделить всё
import Events;
import SharedContext;
int main() {
EventManager manager;
SharedContext context;
context.m_eventManager = &manager;
return 0;
}
Код: Выделить всё
SharedContext
Итак, мне здесь не повезло, и это просто то, что не работает при использовании модулей?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ss-type-is