| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | «  : 10-11-2011 14:46 »  |  | 
 
 Есть базовый класс CObject,от него наследуется singletone-класс CChild.Задача :
 - как сделать так,чтобы при помощи CObject можно было просигнализировать клиентам CChild о наступлении какого-либо события?
 
 Т.е. имеется объект класса CObject,он отслеживает некоторые события,о которых должны знать клиенты CChild.
 
 Подскажите способ реализации...при помощи static членов CObject или callback-ов?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #1 : 10-11-2011 15:37 »  |  | 
 
 Подскажите способ реализации...при помощи static членов CObject или callback-ов?
 Не "или" - "и". |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #2 : 10-11-2011 16:02 »  |  | 
 
 А причём тут CObject? Отношение между CChild и его клиентами - это структурное отношение. Не "или" - "и". (Подумав.) Да. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	|  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #4 : 11-11-2011 06:25 »  |  | 
 
 AlexCasual, в CObject должны быть реализованы:1. Регистрация и разрегистрация любого числа callback.
 2. Механизм генерации событий.
 3. Диспетчер событий, распространяющий п.2 согласно п.1.
 
 Больше ничего по тому, что ты написал сказать не могу. Слишком поверхностно.
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #5 : 11-11-2011 06:56 »  |  | 
 
 RXL,огромное спасибо!
 При помощи объектов CObject - проверяется размер файла на диске и если он меньше определённого размера об этом должны узнать клиенты CChild и удалить данный файл.
 
 RXL,а можно немного подробнее?)
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #6 : 11-11-2011 07:08 »  |  | 
 
 AlexCasual, сперва ты расскажи подробнее, чтобы мы знали, на что тратим свое время. Пока похоже, что ты не совсем представляешь себе задачу, ее цели и пути реализации. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #7 : 11-11-2011 11:06 »  |  | 
 
 RXL,грубо говоря объект класса CObject должен просигнализировать(установить переменную?) о том,что размер файла меньше заданного,а singletone CChild подхватить и обработать данную ситуацию.Если на CObject возлагается регистрация и разрегистрация коллбэка,то какие действия должен выполнить CChild?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #8 : 11-11-2011 11:36 »  |  | 
 
 Я не заметил, чем последний пост отличается от первого.Не придумывай сложностей заранее - они сами добавятся в процессе разработки.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #9 : 11-11-2011 13:36 »  |  | 
 
 Если человек знает, что такое "одиночка", то наверно должен знать и про "наблюдатель". |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #10 : 12-11-2011 19:12 »  |  | 
 
 Если использовать паттерн Observer,то меня смущает такой момент : ведь CChild наследуется как singletone от CObject,поэтому CObject ничего не может знать о классе CChild и хранение ссылок на CChild в CObject - нарушение наследования?Ко всему CChild - singletone...Или я что-то не понимаю? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #11 : 12-11-2011 21:13 »  |  | 
 
 AlexCasual, ты не то не понимаешь, ты вообще бредишь.
 Во-первых, "одиночка" и наследование - вещи между собой несовместимые (из-за закрытия конструкторов одиночки), а потому между собой не связанные. Поэтому фраза "наследуется как singletone" - это какая-то ерунда. Либо сперва наследуется, а потом уже становится одиночкой, либо никак, потому что одиночка не наследуется из-за закрытых конструкторов.
 
 Во-вторых, да, конечно, предок не имеет информации о потомках (и не надо ему её иметь).
 
 В-третьих внутри предка можно хранить ссылки на объекты классов-потомков без раскрытия информации о классах-потомках. Это самый обыкновенный полиморфизм, и проблем тут никаких нет. Предку достаточно знать свой собственный класс (и он сам себя знает), чтобы работать с экземплярами всей своей иерархии.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #12 : 13-11-2011 08:56 »  |  | 
 
 Либо сперва наследуется, а потом уже становится одиночкой ...так и есть. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #13 : 13-11-2011 10:31 »  |  | 
 
 Вот набыдлил такой вариант :observer.h test.cpp#include <windows.h>
 class CObject
 {
 public:
 CObject() {};
 ~CObject() {};
 
 public:
 
 virtual void update() {};
 
 void static add_reference(CObject* ref)
 {
 m_observer = ref;
 }
 
 void static remove_reference(CObject* ref)
 {
 }
 
 public:
 void static _notify()
 {
 m_observer->update();
 }
 
 private:
 static CObject* m_observer;
 };
 
 class CChild: public CObject
 {
 private:
 CChild() :CObject() {};
 
 public:
 ~CChild();
 
 public:
 virtual void update()
 {
 if(m_refresh == false)
 {
 m_refresh = true;
 }
 }
 
 bool is_refresh()
 {
 if(m_refresh)
 {
 MessageBoxA(NULL,"lalala","llll",1);
 }
 return m_refresh;
 }
 
 public:
 static CChild* Instance()
 {
 if (!m_pInstance)
 m_pInstance = new CChild;
 
 return m_pInstance;
 }
 private:
 bool m_refresh;
 static CChild* m_pInstance;
 };
 
#include "observer.h"
 CObject* CObject::m_observer = NULL;
 
 CChild* CChild::m_pInstance = NULL;
 
 int main(int argc, char* argv[])
 {
 CObject cobjct;
 
 CChild::Instance()->add_reference(CChild::Instance());
 cobjct._notify();
 bool  res = CChild::Instance()->is_refresh();
 
 return 0;
 }
 
Правильно ли я уловил идею? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #14 : 13-11-2011 15:05 »  |  | 
 
 AlexCasual, для наблюдателя static не нужны в общем случае. Идея непонятна. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #15 : 14-11-2011 06:47 »  |  | 
 
 для наблюдателя static не нужны в общем случае. Идея непонятна. Но,например,я создаю 10ть объектов CObject,а singleton CChild имеет один экземпляр...как в этом случае узнать,от какого именно CObject пришло уведомление? Если убрать static - идея будет понятна? |  
						| 
								|  |  
								| « Последнее редактирование: 14-11-2011 07:03 от AlexCasual » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #16 : 14-11-2011 07:25 »  |  | 
 
 AlexCasual, начинать надо с замысла.
 Ты сам сказал, что утебя есть 1 родительский класс и несколько потомков-одиночек.
 
 Каждый экземпляр одиночки есть независимый экземпляр предка, сам предоставляет всем окружающим возможность подписаться на его события потому, что предок реализует наблюдателя.
 
 А вот что ты наворотить хочешь, остаётся непонятным. Если "доску объявлений", то причём тут вообще наследование? Это всё решается через структурные отношения между 1 экземпляром "доски" и многими экземплярами её пользователей, которые на ней вывешивают объявления (или флаги событий) и читают с неё. В доске при желании можно реализовать наблюдателя.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #17 : 14-11-2011 09:43 »  |  | 
 
 Ещё раз...
 Есть объект класса CObject, есть объект класса CChild (singletone ::Instance())...объект CObject должен оповестить объект CChild о наступлении какого-либо события...
 
 "Фабрики" и "доски" здесь не при чём...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #18 : 14-11-2011 11:03 »  |  | 
 
 AlexCasual, попробуй, всё-таки, описать саму задачу, а не техническую проблему. Тут никто не понимает, чего ты хочешь добиться своей конструкцией. То есть, не описывай "как" - опиши, что ты пытаешься сделать. Не технически, а по смыслу.  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #19 : 18-11-2011 10:31 »  |  | 
 
 Вад,задача банальна - у меня есть огромный кусок кода,который писал не я,мне необходимо дописать функционала немного на основании уже созданных классов...Поэтому я формулирую задачу так,как сам её и понимаю...Попробую ещё раз - есть общий интерфейс класса CObject,в одном потоке создаётся объект данного класса obj_1,с помощью его производятся некоторые манипуляции,а во втором потоке происходит работа с singleton'ом CChild,который должен произвести некоторые действия по событию от obj_1...Как смог...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #20 : 18-11-2011 10:52 »  |  | 
 
 Попробуем отделить твою задачу от того, что уже написано другими. Во-первых, я для себя переформулировал происходящее, в моём понимании.  Есть некий тип, мы создаём экземпляр этого типа, чтобы выполнять над ним некоторые полезные действия. При этом, во втором потоке мы хотим получать уведомления о событиях, происходящих в результате наших действий. Так? Теперь, где чьё: полезные действия уже реализованы до тебя в этом CObject, или ты пытаешься сам обернуть это всё в собственноручную конструкцию? Аналогично с синглетоном - он твой, или это уже относится к чужому коду? В чём состоит твоя персональная задача по "дописыванию функционала"?  Примеры формулировки задач: "сделать свою реализацию _полезных_действий_", "добавить в код CObject механизм уведомления о событиях", и т.п. Просто, пока всё ещё непонятно, что же это за кусок кода, какие ограничения накладываются этим куском, что нужно поменять в этом куске, и как ты себе видишь эти изменения. Вот это я и называю описанием задачи. При этом, в детали по поводу чужого кода вдаваться не обязательно, если это коммерческая информация    Но ограничения и необходимые действия осознать и описать надо обязательно - без этого мотивация конкретных практических действий не ясна совершенно. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #21 : 18-11-2011 10:52 »  |  | 
 
 AlexCasual, ты не понимаешь, что такое описание задачи. Надо понять в общих чертах, что и зачем  делает тот большой кусок кода. Только после этого ты сможешь что-то расширить и вмешаться в работу этого большого куска так, чтобы при этом ничего не развалилось. "Создаётся объект", "с его помощью производятся манипуляции" и т.д. - это не описание задачи, а описание имеющегося решения не понять чего. а во втором потоке происходит работа с singleton'ом CChild,который должен произвести некоторые действия по событию от obj_1... Так "наблюдатель" не обеспечивает работу в разных потоках. Если ты вызываешь обработчик события из CObject, то этот обработчик работает в этом же потоке. Тогда схема вообще другая, нужно объекты синхронизации использовать, флаги Event или что-то в этом духе. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| AlexCasual 
								Помогающий    Offline | 
								|  | « Ответ #22 : 18-11-2011 15:52 »  |  | 
 
 Вад,да.ты всё совершенно верно понял.
 Мне необходимо "добавить в код CObject механизм уведомления о событиях".
 
 Потоки это частный случай,методы пассивного/активного ожидания не интересуют...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #23 :  18-11-2011 17:25 »   |  | 
 
 AlexCasual, это у тебя в соседней теме.
 Напиши и отработай прототип, затем перенесёшь идею реализации в основной код.
 
 Вот у тебя классы: A - подписывает и отписывает подписчиков на события, сообщает подписчикам о событии путём вызова их сигнального метода; и B - подписчик с сигнальным методом.
 
 Вот возьми и напиши чистое решение в один файл. Вопрос 10-20 строчек.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	|  |