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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли события в С++?.. или их аналог?.. 
:(
    Опции темы
Kurt
Дата 11.9.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Блуждая в поисках работы (ну не везет мне пока! smile ), наткнулся на задание реализовать простенькую игрушку - одна фигрука (управляемая компьютером) пытается в лабиринте настигнуть другую фигурку (управляется игроком). Естественно, нужно было уметь пересчитывать траекторию движения автоматической фигурки как только юзер изменил положение своей фигурки.
Первоначально просили сделать на С++, но в итоге сошлись на C#. (smile) Проблема пересчета траектории была решена через события. Как только "ручной" объект перешел на другую клетку лабиринта, генерится событие, к-е обрабатывается "автоматическим" объектом - заново вычисляется путь.
Задание сделал и отправил. Теперь вот думаю, как бы я решил эту задачу на С++.
Подскажите, пожалуйста, есть ли в С++ что-то подобное событиям? То есть мне надо чтобы один объект при наступлении некоторых условий генерировал событие, а другой - реагировал на него. Если можете показать пример, как это сделать - вообще здорово..


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
srd
Дата 11.9.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

Репутация: 27
Всего: 49



Существуют разные реализации схемы сигнал/слот. Например, boost::signals или libsigc++


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Void
Дата 11.9.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Пример кода с использованием Boost.Signals и Boost.Bind:
Код
#include <iostream>

#include <boost/signal.hpp>
#include <boost/bind.hpp>

class EventProducer {
    typedef boost::signal<void(int)> signal_t;
    typedef boost::signals::connection connection_t;
    signal_t sig_;
    int x_;
public:
    EventProducer(int x) : x_(x) { }
    void fire_event() {
        std::cout << "Event fired: x = " << x_ << std::endl;
        sig_(x_);
    }
    connection_t connect(signal_t::slot_function_type subscriber) {
        return sig_.connect(subscriber);
    }
};

class EventConsumer {
    int id_;
public:
    EventConsumer(int id) : id_(id) { }
    void process_event(int x) {
        std::cout << "Event consumed: x = " << x << ", id = " <<
            id_ << std::endl;
    }
};

int main() {
    using namespace boost::signals;
    EventProducer obj(3);
    EventConsumer obj1(1), obj2(2);
    obj.connect(boost::bind(&EventConsumer::process_event, &obj1, _1));
    connection c2 =
        obj.connect(boost::bind(&EventConsumer::process_event, &obj2, _1));
    obj.fire_event();
    c2.disconnect();
    obj.fire_event();
}

Вывод:
Код
Event fired: x = 3
Event consumed: x = 3, id = 1
Event consumed: x = 3, id = 2
Event fired: x = 3
Event consumed: x = 3, id = 1



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
chipset
Дата 12.9.2005, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Исключения можешь бросать и ловить другими классами.
А вообще просто закидываешь делегат и вызываешь при необходимости (вариант лучше) smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Void
Дата 12.9.2005, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(chipset @ 12.9.2005, 05:45)
Исключения можешь бросать и ловить другими классами.

Это как (в контексте задачи)? smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
chipset
Дата 12.9.2005, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(Void @ 11.9.2005, 20:31)
Это как (в контексте задачи)?

Перечитал, понял - в контексте задачи никак, да и не красиво это, в общем smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Guest
Дата 12.9.2005, 08:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Это можно и без boost делаеть . См паттерн Chain of Responsibility.
Но в вашем случае всего то два объекта, один из которых генерит запрос, другой обрабатывает. Это вообще элементарно
  Вверх
oleg1973
Дата 12.9.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



чет вы перемудрили слишком
что мешает сделать 2 процедуры - первая для "ручного" обьекта а вторая для автоматического и гонять их в цикле?
какие нафиг события?

п.с.
куда катится мир?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Ignat
Дата 12.9.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(oleg1973 @ 12.9.2005, 11:09)
гонять их в цикле

Батенька, да вы извращенец. В реалтайме цикл гонять?

И какие нифиг процедуры в С++?


--------------------
Теперь при чем :P
PM   Вверх
Dreamer_0x01
Дата 12.9.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



может я не очень въехал в тему.

1. писать свой цикл обработки сообщений
2. есть достаточно эффектный путь, который с успехом применяется в Яве - там есть такая фича, как интерфейсы. Говорят, что в С++ аналогичная штука делается с помощью множественного наследования. Щас может быть соображу, как ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Denn
Дата 12.9.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dreamer_0x01 @ 12.9.2005, 14:26)
Говорят, что в С++ аналогичная штука делается с помощью множественного наследования. Щас может быть соображу, как ;)

Шаблон Command называется.
PM MAIL ICQ   Вверх
Kurt
Дата 12.9.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Dreamer_0x01
Если покажешь пример - буду очень благодарен..

[offtop]
Н-да.. Надо подтянуть свои знания в C++.. smile
[/offtop]


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
oleg1973
Дата 13.9.2005, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



мамамиииия какой маразм, люди вы бредите
и так представим некое поле в виде клеточек по которому бродят 2 фигуры (размером в клетку)
на даном поле есть некоторые клетки которые нельзя пройти (стены блин)
так как шаг фигуры равен размеру клетки , то вообшем я не вижу проблем для реализации алгоритма

Ignat
ну а в чем проблема?
сначала вызову некий алгоритм который обрабатывает нажатия пимп/джойстика/мыши юсера
а потом вызову алгоритм хождения моей клетки которая получив координаты клетки юсера просчитает оптимальную траэкторию движения




--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Kurt
Дата 13.9.2005, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



oleg1973
алгоритм поиска, конечно, понятен. вопрос в оптимальном организации системы - ты предлагаешь в цикле гонять процедуры проверки наступления некоторых условий? (в моем случае - премещение объекта на соседнюю клетку). А если объектов (разных) будет 10? 50? 100?

З.Ы.
Господа, обсуждение уходит в сторону. Я, собственно, ничего против не имею, но все же.. smile


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
chipset
Дата 13.9.2005, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Реализуешь указатель на функцию-член класса.
Передаешь её как обработчик события.
В случае чего оно вызываеться. Ну не события конечно в прямом понятии, но любые события сводяться к циклу или чему то такому.
Добавлено @ 03:05
А Boost не надо тянуть, имхо.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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