![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
jonie |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
Пусть у нас есть Сишный код:
и нам надо такой код превратить в класс С++ (стандартная, кстати задача):
В коде в месте (1) нам нужно начать работу с callback. Естественно, что указанный калбэк должен быть статическим и тем самым в непосредственно реализации этой функции мы не имеем this. Вопрос: как сделать так, чтобы в нашем callback мы могли бы получить this того объекта, который производил регистрацию? * *) например в C# можно использовать замыкания вроде
Но как такое сделать в C++ при указанный условиях что-то не дохожу... Недорешение: мы можем сделать связку сишного контекста (int) с Ctx* используя нечто вроде
и при регистрации в Ctx::Start() добавлять в карту маппинг, но это как-то уныло. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||
|
|||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
jonie
А в чем проблема передать this как аргумент в callback например с помощью boost::bind? Конечно, придется немного модифицировать функцию RegisterCallback и сделать ее шаблонной, но думаю ничего страшного.
Это сообщение отредактировал(а) azesmcar - 14.1.2011, 11:01 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
все зависит от того где регистрируется колбяк и как нужно это отразить на множество объектов.. обычно в С делают доп параметр void*, вот его для thisa можно использовать..желательно только сам метод разгрузить через статическую функцию.. в таком случае Ваше замыкание не подойдет ![]() а так в C++ есть (boost::/ std:: ) function и bind для организации замыканий.. Добавлено через 2 минуты и 38 секунд
шаблонной не обязательно.. ![]() но насколько я понял, колбяк нужен для Си-функции, тогда эти методы отпадают.. Добавлено через 4 минуты и 34 секунды вот пример по этой теме : http://liveworkspace.org/code/f3ee5f16c898...b005f46d06d1339 из соседней темы : http://forum.vingrad.ru/forum/topic-320038.html Это сообщение отредактировал(а) mes - 14.1.2011, 11:13 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
ага, callback нужен для сишной функции и только для неё. Модифицировать Сишный код никак нельзя.
void* userObject - такого Сишная либа не предусматривает (см. выше). Еслиб можно было - не было бы проблем - именно как тут http://liveworkspace.org/code/f3ee5f16c898...b005f46d06d1339 яб и сделал не думая 8) Еще раз для понимая: всё что есть это контекст, который также создается Си либой. И это внутренее "нечто" этой либы. если говорить про C# код, то подойдет и будет работать. Я вроде не ошибаюсь в этом месте... Еще варианты? Вот тут чувак пишет что ниче у меня не выйдет (первый ответ): http://stackoverflow.com/questions/2001604...d-boostfunction Это сообщение отредактировал(а) jonie - 14.1.2011, 11:35 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так Вам для Сишной функции надо то ![]() так какие параметры предусмотрены ? если никаких, то по какому принципу отражать на множество объектов ? а если нужно на один, то решается просто - заведите статическую переменную под нужный this.. Добавлено @ 11:44 там Вы привели совсем другую функцию.. ![]() для ответа на ваш вопрос нужно знать, что есть эти параметры на самом деле.. в общем Вам нужно определить есть ли среди параметров такой, вместо которого можно подсунуть this... Это сообщение отредактировал(а) mes - 14.1.2011, 11:47 |
|||
|
||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
этот метод я описывал в топике под именем "Недорешение" .. ну да, наверно иначе и никак не получится... ведь в функции я действительно никак не узнаю о this как бы не старался. Хотя C# вот как-то выкручивается.. надо почитатьс как он это делает. Наверно такой же метод использует в конечном итоге. Это сообщение отредактировал(а) jonie - 14.1.2011, 11:46 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тогда нужно определиться : во первых там описано другое, во вторых способов со статической переменной несколько.. точнее способ то в принципе один, восприятий несколько.. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
например, можно на каждый адрес функции колбяка отразить свой делегат... вот пример для размышления и допиливания под свои нужды : http://liveworkspace.org/code/47d75b234a07...8c569f74af6a251 Это сообщение отредактировал(а) mes - 14.1.2011, 12:29 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
ну я собственно так и сделал у себя, но мне чет не особо понравилось 8)
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну а поконкретней, чего не понравилось то ? Добавлено через 3 минуты и 34 секунды если Вы об этом
то это совсем другое.. в примере нет (ран-тайм) карты и ассоциация метода идет к адресу функции колбяка... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот еще вариантик:
http://liveworkspace.org/code/eddee3669c8a...14f172d741cf696 с тем ограничением, что переменная функции должна иметь внешнее связывание.. (т.е.грубо говоря должна быть определена вне функционального блока) Это сообщение отредактировал(а) mes - 14.1.2011, 13:10 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
ну это понятно. Я имел в виду что в общем связь хранится в неком статической внешней (по отношениею к создавающему объекту) переменной. А вот что хранится ней: указатель ли на объект или указатель на функцию в этом объекте на самом деле не важно. этак можно и до boost::signals2 дойти ) Это сообщение отредактировал(а) jonie - 14.1.2011, 13:32 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну так естественно, если нет (подходящего) параметра, то нужна связь.. вопрос в том какой род связи подойдет лучше для задачи ![]() Добавлено через 2 минуты и 51 секунду
это да.. вопрос не в том, что хранится, а к чему ассоциировано то, что хранится.. Добавлено через 5 минут и 10 секунд можно и во внутренней.нужно только знать об отношении колбяка к объекту.. а об этом, по той части информации что Вы привели, догадаться не возможно.. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |