Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: RE: Трудности с созданием событий  (Прочитано 27070 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« : 12-03-2010 08:19 » 

Доброе утро. Возникли трудности с созданием событий.
В общем-то, наверное в коде все понятно - есть 2 класса, необходимо, чтобы один реагировал на события другого. Наследования не предлaгать, интересует именно создание обработчиков событий. В C# были делегаты и эвенты, а в С++ что-то не доходит, как его грамотно реализовать.

Код:
using namespace std;
class CDTransformation;

//  Класс, который должен подписаться на событие и обработать его функцией ( ее можно
//  сделать приватной?) void setRect(CRect rect) {m_rect=rect;}
class CDisplay
{
public:
~CDisplay(){delete m_pTransform;}
CRect getRect(){return m_rect;}

//void setRect(CRect rect) {m_rect=rect;}
void setDisplayTransform(CDTransformation* pTransform){m_pTransform=pTransform;}

private:
CRect m_rect;
CDTransformation* m_pTransform;
};
Код:
//Класс, который должен генерировать событие при вызове функции void setBounds(CRect rect)
class CDTransformation
{
public:
void setBounds(CRect rect) {tRect=rect;}

private:
CRect tRect;
};
Код:
int main()
{
CDisplay display;
CDTransformation* pDT = new CDTransformation();

display.setDisplayTransform(pDT);

CRect rect(0,0,100,100);
pDT->setBounds(rect); //В этом месте объект display должен среагировать на событие и поменять свой m_rect

int x;
cin>>x;
return 0;
}
« Последнее редактирование: 12-03-2010 08:22 от yudjin » Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 12-03-2010 10:26 » 

Папки по пятницам не работают Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 12-03-2010 11:19 » 

yudjin, а почему в старую тему ? Что новую не создал ?
Записан

yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 12-03-2010 11:24 » 

потому что тема Про Callback - ведь это он отвечает за подобное?
Я вообще не уверен, как в С++ называется то, что я называю "событие" и "подписка на событие", но если там такие понятия есть - можно перенести тему и сделать показательный пример Улыбаюсь я не нашел на форуме
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 12-03-2010 11:27 » 

yudjin, в c++ нет событий Улыбаюсь Это элемент ОС

переношу
Записан

yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 12-03-2010 11:49 » 

передача управления функции - задача ОС?? как это нет событий... ничего не понимаю. Я имею ввиду не события "Windows messages", а события, которые есть в пользовательских классах в ObjPascal, C# - произошло что-то, вызывается Invoke(), и класс-подписчик об этом узнает и реагирует. Не верю, что в С++ такого нет
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 12-03-2010 11:53 » 

yudjin, не могу понять, о чём ты (  Я думал про Events
Записан

zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #7 : 12-03-2010 11:57 » 

Собственно события, к примеру, в Borland и есть callback-функция
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #8 : 12-03-2010 11:59 » 

Алексей1153++, в Borland - это указатель на пользовательский обработчик, который можно вставить в код.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 12-03-2010 12:03 » 

понятно. Только второй класс сам должен коллбэк вызывать, автоматом ничего не происходит ) Поэтому я про события и не понял
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 12-03-2010 12:11 » 

yudjin, а чего тут верить или нет? Открывай Страуструпа или на худой конец стандарт и смотри там. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #11 : 12-03-2010 13:19 » 

Приду домой - так и сделаю, прочитаю в твердой копии Улыбаюсь Просто как всегда надеялся, что уже есть готовые решения )
Прочитаю, быть может освою, тогда и выложу для таких же как я. Всем спасибо.
Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #12 : 16-03-2010 07:21 » 

Наблюдатель, Observer — поведенческий шаблон проектирования. Также известен как «подчинённые» (Dependents), «издатель-подписчик» (Publisher-Subscriber).

Назначение
Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.



При реализации шаблона «наблюдатель» обычно используются следующие классы.
Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей.
Observer — интерфейс, с помощью которого наблюдаемый объект оповещает наблюдателей.
ConcreteObservable — конкретный класс, который реализует интерфейс Observable.
ConcreteObserver — конкретный класс, который реализует интерфейс Observer.

Область применения

Шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:
существует, как минимум, один объект, рассылающий сообщения
имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.

Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.

Код:
#include <iostream>
#include <string>
#include <map>
#include <boost/foreach.hpp>
 
class SupervisedString;
class IObserver{
public:
virtual void handleEvent(const SupervisedString&) = 0;
};
Код:
class SupervisedString{ // Observable class
std::string _str;
std::map<IObserver* const, IObserver* const> _observers;
  typedef std::map<IObserver* const, IObserver* const>::value_type item;
 
void _Notify(){
BOOST_FOREACH(item iter, _observers){
iter.second->handleEvent(*this);
}
}
 
public:
void add(IObserver& ref){_observers.insert(item(&ref, &ref));}
 
void remove(IObserver& ref){ _observers.erase(&ref);}
 
const std::string& get() const{return _str;}
 
void reset(std::string str){_str = str; _Notify();}
};
Код:
class Reflector: public IObserver{ // Prints the observed string into std::cout
public:
virtual void handleEvent(const SupervisedString& ref){
std::cout<<ref.get()<<std::endl;
}
};
 
class Counter: public IObserver{  // Prints the length of observed string into std::cout
virtual void handleEvent(const SupervisedString& ref){
std::cout<<"length = "<<ref.get().length()<<std::endl;
}
};
Код:
int main(){
 
SupervisedString str;
Reflector refl;
Counter    cnt;
 
str.add(refl);
str.reset("Hello, World!");
std::cout<<std::endl;
 
str.remove(refl);
str.add   (cnt);
str.reset("World, Hello!");
std::cout<<std::endl;
 
return 0;
}
Взято из википедии http://ru.wikipedia.org/wiki/Observer_(модель)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines