Мое приложение содержит несколько модулей (больших классов), таких как сеть io, хранилище данных, элементы управления и т. Д. Некоторые из них могут взаимодействовать. Что было бы хорошим способом объявить и связать модули? Я вижу несколько возможностей:
1) Все модули объявлены как глобальные, поэтому мы имеем в main.cpp
#include ...
ModuleA a;
ModuleB b;
ModuleC c;
и если a хочет поговорить, например, с модулем c, в a.cpp будет следующее:
#include "c.hpp"
extern ModuleC c;
и т. Д .;
2) Все модули объявлены в main (), поэтому они являются локальными. Привязки производятся в конструкторах:
int main() {
ModuleC c;
ModuleA a(c);
ModuleB b;
}
но при этом было бы сложно связать объекты, которые хотят друг друга (a (c), c (a))
3) Первый этап: объявить локально, второй этап: связать с указателями:
int main() {
ModuleA a;
ModuleB b;
ModuleC c;
a.Connect(&b);
b.Connect(&a);
c.Connect(&a, &b);
}
Есть ли лучший способ? Я бы хотел, чтобы это было в стиле cpp. Третий способ удерживает указатели, что немного сбивает с толку (хотя с валидностью указателей проблем не возникнет, хотя модули все время живут, но все же) и имеет двухфазную инициализацию, которая не гарантирует, что мы не забудем init некоторый модуль, а ой - неверный указатель. Второй способ (как я думаю) может разрушить всю идею, если некоторые объекты нуждаются в перекрестном связывании. Первый способ кажется естественным (поскольку модули представляют само приложение), но разве это не плохой стиль? Я видел несколько проектов, в которых модули были объявлены в каком-то классе юниверсов, и они взаимодействуют через этот юниверс, как это было бы, если бы все они были глобальными. Что ты думаешь?
Спасибо.