Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> События С++ 
V
    Опции темы
Qu1nt
Дата 20.6.2010, 20:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



Доброго, getlocaltime()!
Помогите реализовать систему событий на C++. Основные критерии:
  • Без использования сторонних библиотек (boost, Qt, etc...)
  • Упор делается на простоту кода
Примерно так это выглядит на Delphi:
Код

program Project11;

{$APPTYPE CONSOLE}

type
  TOnClick = procedure (X, Y: Integer) of object;
  { OnMouseMove, OnKeyDown, etc... }

  TDummy = class
  private
    FOnClick: TOnClick;
  public
    procedure Fire;
    property OnClick: TOnClick read FOnClick write FOnClick;
  end;

  TExample = class
    constructor Create;
    destructor Destroy; override;
  private
    FDummy: TDummy;
    procedure MouseClick(X, Y: Integer);
  end;

  { TDummy }
  procedure TDummy.Fire;
  begin
    if Assigned(FOnClick) then
      FOnClick(10, 10);
  end;

  { TExample }
  constructor TExample.Create;
  begin
    FDummy := TDummy.Create;
  end;

  destructor TExample.Destroy;
  begin
    FDummy.Free;
  end;

  procedure TExample.MouseClick;
  begin
    WriteLn(X, Y);
  end;

begin
  with TExample.Create do
  try
    FDummy.OnClick := MouseClick;
    FDummy.Fire;
  finally
    Free;
  end;
  ReadLn;
end.

Заранее спасибо!
PM MAIL   Вверх
Alca
Дата 20.6.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

Код

FDummy.OnClick := MouseClick;


Типа так?

Это сообщение отредактировал(а) Alca - 20.6.2010, 21:07


--------------------
PM WWW ICQ Skype Jabber   Вверх
Qu1nt
Дата 20.6.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



С удовольствием рассмотрю все варианты smile
PM MAIL   Вверх
Alca
Дата 20.6.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50





--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 21.6.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Варианты называются closure pointer, далее в google  smile 


PM MAIL   Вверх
jonie
Дата 22.6.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



кстати, я на RSDN видел статью про делегаты в c++ , но там много хардкода было
http://www.rsdn.ru/article/cpp/delegates.xml


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 22.6.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



А если сделать события в стиле Java?
Есть интерфейс слушателя событий (абстрактный класс) в котором метод реакции на события,
а объект, который создает события имеет 2 метода: добавить и удалить слушателя... Если возникло событие,
объект просто перебирает слушателей и вызывает их метод реакции на событие... В общем как-то так... smile


--------------------
user posted image
PM MAIL ICQ   Вверх
xvr
Дата 22.6.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(kosmonaFFFt @ 22.6.2010,  09:48)
Есть интерфейс слушателя событий (абстрактный класс) в котором метод реакции на события,
... 
Если возникло событие,
объект просто перебирает слушателей и вызывает их метод реакции на событие

Если объект может выступать слушателем для многих событий (в подавляющем большинстве случаев это именно так), то попытка множественно унаследоваться от одного и того же интерфейса будет весьма и весьма замысловатой (примерно как секс в гаммаке и в противогазе)  smile Это путь для настоящих Джедаев, остальные используют делегатов/closure pointers/member pointers/slots/etc

PM MAIL   Вверх
Qu1nt
Дата 26.6.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



Реализовал самый простой вариант:
Код

class Dummy {
    public:
        typedef void (* onClickEvent)(int, int);
        typedef void (* onKeyPressEvent)(char);

        Dummy();
        void fire();

        onClickEvent onClick;
        onKeyPressEvent onKeyPress;
};

class Example {
    public:
        static void mouseClick(int x, int y);
};

Dummy::Dummy() {
    onClick = 0;
    onKeyPress = 0;
}

void Dummy::fire() {
    if (onClick != 0)
        onClick(10, 10);
}

void Example::mouseClick(int x, int y) {
    OutputDebugString(L"mouseClick()\n");
}

void run() {
    Dummy dummy;
    dummy.onClick = &Example::mouseClick;
    dummy.fire();
}

Для себя решил, что если нужно что-то более функциональное - лучше использовать сторонние решения. 
Кстати, в новом C++0x появился std::bind.
PM MAIL   Вверх
mes
Дата 26.6.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Qu1nt @  26.6.2010,  12:21 Найти цитируемый пост)
Реализовал самый простой вариант:

и потеряли преимущество классов... 



--------------------
PM MAIL WWW   Вверх
Qu1nt
Дата 26.6.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



mes, а по-подробней? smile
PM MAIL   Вверх
borisbn
Дата 26.6.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Qu1nt @  20.6.2010,  20:52 Найти цитируемый пост)
Без использования сторонних библиотек (boost, Qt, etc...)

Цитата(Qu1nt @  26.6.2010,  13:21 Найти цитируемый пост)
Для себя решил, что если нужно что-то более функциональное - лучше использовать сторонние решения.

Это как ?

и ты уверен, что строчка
Цитата
dummy.onClick = &Example::mouseClick;

компиляется ?
Хотя, конечно, если функция Example::mouseClick - статическая, то да, так можно, но тогда в ней не будет доступа к нестатическим членам класса Example


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Qu1nt
Дата 26.6.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



Цитата(borisbn @  26.6.2010,  14:14 Найти цитируемый пост)
Это как ?

Предполагалось, что моего скилла C++ хватит, чтобы написать красивое и функциональное решение. Увы.
Зато выяснил, что делегаты мне ни к чему.
Цитата(borisbn @  26.6.2010,  14:14 Найти цитируемый пост)
компиляется ?

Угу. Но, ты прав - с обычными методами не работает. Что делать? smile
PM MAIL   Вверх
borisbn
Дата 26.6.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



а чем тебе вариант kosmonaFFFt'а не понравился. Кажется он по-английски называется паттерн observer
Код

class MessageHandler {
public:
    virtual void onClick( int, int ) = 0;
};

class Dummy {
    setMessageHandler( MessageHandler * h ) { m_handler = h; }
    void fire() { if ( m_handler ) mHandler->onClick(10, 10); }
}

class Example : public MessageHandler {
    virtual void onClick( int, int ) { ... }
};

void run() {
    Dummy dummy;
    Emaple ex;
    dummy.setMessageHandler( &ex );
    dummy.fire();
}


Это сообщение отредактировал(а) borisbn - 26.6.2010, 16:23


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 27.6.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(xvr @  22.6.2010,  11:35 Найти цитируемый пост)
Если объект может выступать слушателем для многих событий (в подавляющем большинстве случаев это именно так), то попытка множественно унаследоваться от одного и того же интерфейса будет весьма и весьма замысловатой (примерно как секс в гаммаке и в противогазе)


А никто и не заставляет делать один интерфейс на разные события - на каждое событие свой интерфейс и вперед... )


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.