Как заранее объявить класс, чтобы использовать указатель на объект типа класса, который объявлен и определен в модуле?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как заранее объявить класс, чтобы использовать указатель на объект типа класса, который объявлен и определен в модуле?

Сообщение Anonymous »

У меня есть несколько классов, связанных с игрой, таких как StateManager, Window, EventManager и т. д.
Эти классы находятся в отдельных модулях. . Модуль 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 создается один раз, загружает все ссылки на уже существующие объекты в свои переменные-члены, а затем передается, поэтому все объекты получают SharedContext может получить доступ к прикрепленным классам, таким как Window, EventManager, TextureManager, GUI_Manager и т. д.
Этот подход несовместим с модулями вообще. Основная проблема заключается в том, что мне не разрешено объявлять имя класса после того, как оно было объявлено в модуле. Таким образом, предварительные объявления здесь неправильно сформированы, и код не будет компилироваться, поскольку все заранее объявленные классы уже существуют в модулях.

Код: Выделить всё

SharedContext
логически не принадлежит ни одному модулю, но сделать его модулем (чтобы я мог экспортировать заранее объявленные классы) тоже не работает.
Следующий минимальный пример жалуется с ошибкой при использовании GCC 14.2:

"ошибка: ссылка на EventManager неоднозначна"; примечание: кандидаты: «класс EventManager@SharedContext» ... примечание: «класс EventManager@Events»

SharedContext.cppm

Код: Выделить всё

export module SharedContext;
export class EventManager;
export struct SharedContext{
EventManager* m_eventManager = nullptr;
};
Events.cppm

Код: Выделить всё

export module Events;
export class EventManager{

};
main.cpp

Код: Выделить всё

import Events;
import SharedContext;
int main() {

EventManager manager;
SharedContext context;
context.m_eventManager = &manager;

return 0;
}
Импорт всех модулей вместо предварительного объявления необходимых классов в файл SharedContext может привести к возникновению циклических зависимостей, поскольку при импорте состояний модуля можно создавать указатель на объект StateManager, импортируется также множество других классов, которые являются частью модуля States. Итак, когда только один из этих классов нуждается в SharedContext, я создаю циклическую зависимость (

Код: Выделить всё

SharedContext
импортирует модуль States, который в одном из разделов модуля может импортировать SharedContext).
Итак, мне здесь не повезло, и это просто то, что не работает при использовании модулей?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ss-type-is
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»