Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.
Для этого я ввел класс Dispatcher, который содержит объекты классов A,B,C, а сами эти классы общаются друг с другом через Dispatcher вызывая функции getClassA();
Но в данном случае получается перекрёстное включение хидеров классов (A,B,C в Dispatcher и наоборот)...
Как решить красиво данную проблему?
Здравствуйте, AlexCasual, Вы писали:
AC>Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.
Ну, хоть что-то они должны знать друг о друге
Решений несколько.
1) предобъявление классов (чтобы можно было пользоваться указателями/ссылками)
/// a.hclass A;
class B;
class C;
class A { .... A* .... B* ..... C* ..... }; // здесь только объявления функций
/// b.hclass A;
class B;
class C;
class B { .... A* .... B* ..... C* ..... }; // здесь только объявления функций
/// a.cpp#include"a.h"// своё объявление#include"b.h"// чужие объявления#include"c.h"
A::foo(A* a, B* b, C* c) { ... b->bar() ... c->xyz ... } // здесь можно пользоваться чужими объявлениями
2) интерфейсы.
По сути, то же самое, но больше возможностей в духе ООП.
Можно разнести то, что классы должны знать друг о друге, и что не должны знать в принципе.
Здравствуйте, AlexCasual, Вы писали:
AC>Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом. AC>Для этого я ввел класс Dispatcher, который содержит объекты классов A,B,C, а сами эти классы общаются друг с другом через Dispatcher вызывая функции getClassA(); AC>Но в данном случае получается перекрёстное включение хидеров классов (A,B,C в Dispatcher и наоборот)... AC>Как решить красиво данную проблему?
У тебя код не компилируется? Если да, то решается через указатели и forward declaration. Я бы в конструкторах классов A,B,C принимал указатель на Dispatcher и работал потом через него. По твоему описанию getClassA подразумевает знание о классе A в других классах.
Посмотри в сторону boost::signal2, или callback-ов, если есть взаимодействие извне с классами ABC, то делай из Dispatcher-а, Facade за которым все прячь.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, AlexCasual, Вы писали:
AC>>Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.
К>Ну, хоть что-то они должны знать друг о друге
К>Решений несколько. К>1) предобъявление классов (чтобы можно было пользоваться указателями/ссылками) К>2) интерфейсы. К>3) шаблоны.
Снизит производительность. Диспетчер может
содержать указатели на те классы, и которые регистрируются
в диспетчере при создании экземпляра. Варианты с
регистрацией и без можно оформить разными конструкторами.
Диспетчер накапливает информацию о всех создающихся экземпляров тех классов.