![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
Всем доброе время суток.
Последние пару лет писал на C#, а тут пришлось на С++ вернуться. Не могу реализовать довольно простую как мне кажется вешь, просто не верится что это не выполнимо ![]() ЗЫ Имеется ввиду не передавая в класс B указатель на класс А Это сообщение отредактировал(а) Ravenan - 24.5.2006, 15:38 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Придется. Но можно замаскировать. Ну например вот так:
(comeau скомпилировал) То есть мы делаем класс каллбэк, а он сам решает что и кому ему передать управление - ф-ции-члену класса, вызвать какую либо обычную ф-цию или ещё что. ps. кстати, этот вопрос всплывает не в первый раз. на моей памяти во второй. это не укор автору темы, это небольшая статистика ![]() Это сообщение отредактировал(а) Mayk - 24.5.2006, 14:52 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
Mayk,
Большое спасибо ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В С++ делегатов нет. Пока. Но можно воспользоваться boost::function - это очень гибкий механизм, который наверняка войдет в следующую реинкарнацию STL.
Это примерно то же самое, что написал Mayk, но гораздо мощнее - любые параметры, любые возвр. значения и т.д. -------------------- ... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
см. Александреску - обобщенный функтор
тоже любое возвращаемое значение, любые параметры (практически их произвольное количество) он может инкапсулировать обычный функтор, указатель на функцию, указатель на функцию-член имхо, обобщеннее трудно себе представить -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
Mayk,
Радость омрачилась ошибкой линкера ![]() Error 1 error LNK2001: unresolved external symbol "public: virtual void __thiscall Callback::operator()(void)" (??RCallback@@UAEXXZ) qq.obj компилятор - VS2005 |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
MAKCim,
Спасибо, теперь все ок! Вот только думаю раз на такие ухищрения приходится идти - может сама архитектура неправильная? ![]() У меня есть класс который прнимает сообщения с клавиатуры через DirectInput. Я хотел бы дать ему хеш-таблицу с callback методами для разных клавиш. Самой обработкой естественно другой класс заниматься будет. Не подскажите - нормальная вообще практика подобная? То есть это стандартный подход при проектировании или подобных ситуаций в С++ стоит избегать? |
|||
|
||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
вполне нормальная сделать что-то типа
и вызывать потом
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
Ravenan |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
MAKCim,
Прошу помощи в решении еще одной возникнувшей проблемы ![]() Все прекрасно работает если метод вызывается непосредственно там куда его передали вроде
А если bc сохранить в каком-то поле класса и вызвать потом из другого метода, то приложение вываливается.
В дебагере видно что хотя сам указатель p не изменился при переходе в другую функцию, значение структуры Callback на которую он указывает самопроизвольно изменилось. Объясните пожалуйста причину подобного побочного еффекта ![]() Это сообщение отредактировал(а) Ravenan - 25.5.2006, 17:33 |
||||
|
|||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
baronp,
да, сорри, подправил |
|||
|
||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
а как ты вызываешь 1-ю функцию?
|
|||
|
||||
Ravenan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.5.2006 Где: Киев, Украина Репутация: нет Всего: нет |
Это сообщение отредактировал(а) Ravenan - 25.5.2006, 17:49 |
|||
|
||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
При вызове foobar в кострукторе A() ты создаешь временный объект, который разрушается после выхода из foobar. Выход: в классе B вместо указателья обявить переменную, но тогда нужен default-конструктор в MemberCallback и там же нужен copy-коструктор.
Добавлено @ 18:01 На счет замены указателья это я погорячился. Надо в первый foobar передавать не ссылку, а указатель, при этом объект MemberCallback в конструкторе А придется создавать динамически. Тогда придется думать об удалении этого объекта (возможно auto_ptr). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |