класс dispatcher
От: AlexCasual  
Дата: 28.03.14 08:35
Оценка:
Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.
Для этого я ввел класс Dispatcher, который содержит объекты классов A,B,C, а сами эти классы общаются друг с другом через Dispatcher вызывая функции getClassA();
Но в данном случае получается перекрёстное включение хидеров классов (A,B,C в Dispatcher и наоборот)...
Как решить красиво данную проблему?
Re: класс dispatcher
От: Кодт Россия  
Дата: 28.03.14 08:45
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.


Ну, хоть что-то они должны знать друг о друге

Решений несколько.
1) предобъявление классов (чтобы можно было пользоваться указателями/ссылками)
/// a.h

class A;
class B;
class C;
class A { .... A* .... B* ..... C* ..... }; // здесь только объявления функций

/// b.h

class 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) интерфейсы.
По сути, то же самое, но больше возможностей в духе ООП.
Можно разнести то, что классы должны знать друг о друге, и что не должны знать в принципе.
// i.h

struct IA;
struct IB;
struct IC;
struct IA { ... IA* ... IB* ... IC* ... };
struct IB { ... IA* ... IB* ... IC* ... };
struct IC { ... IA* ... IB* ... IC* ... };

// a.h, a.cpp

#include "i.h"

class A: public IA { ... pIB->bar() ... pIC->xyz ... };

Тут диспетчер будет клеем, который раздаёт указатели на интерфейсы объектов друг другу.

3) шаблоны.
Это способ сказать компилятору "подожди искать чужое объявление — оно будет ниже, ты его там увидишь, когда надо"
Перекуём баги на фичи!
Re: класс dispatcher
От: Igore Россия  
Дата: 28.03.14 08:52
Оценка:
Здравствуйте, 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 за которым все прячь.
Re[2]: класс dispatcher
От: Sashaka Россия  
Дата: 28.03.14 10:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, AlexCasual, Вы писали:


AC>>Есть класс A,B,C, которые ничего не должны знать друг о друге, но должны иметь возможность взаимодействовать друг с другом.


К>Ну, хоть что-то они должны знать друг о друге


К>Решений несколько.

К>1) предобъявление классов (чтобы можно было пользоваться указателями/ссылками)
К>2) интерфейсы.
К>3) шаблоны.

4) делегаты (события/сигналы)
Re[3]: класс dispatcher
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.03.14 12:46
Оценка:
5) RPC/RMI
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: класс dispatcher
От: smeeld  
Дата: 28.03.14 13:26
Оценка: :)
Здравствуйте, Sashaka, Вы писали:


S>4) делегаты (события/сигналы)


Снизит производительность. Диспетчер может
содержать указатели на те классы, и которые регистрируются
в диспетчере при создании экземпляра. Варианты с
регистрацией и без можно оформить разными конструкторами.
Диспетчер накапливает информацию о всех создающихся экземпляров тех классов.
Re: класс dispatcher
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 28.03.14 14:03
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>Как решить красиво данную проблему?

В твоём случае подойдёт паттёрн Медиатор. Там и пример есть.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.