| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Указатели на функции-члены |
| Автор: BabySG 30.9.2005, 20:00 | ||
Есть следующее построение:
Как передать в fD() указатели на fA() и fB()? Если написать в виде Base::* - не катит |
| Автор: Mad 30.9.2005, 20:08 | ||
|
| Автор: BabySG 30.9.2005, 20:11 |
| Собственно, только что читал про это недалеко на форуме Так вот - не катит Классы А и Б - тут упрощенно приведено - их порядка 100... Количество функции - соотвественно.. Не прописывать же каждую в базовый! (Вдобавок - могут иметь одинаковые названия - но разные реализации ) Далее: вопрос может встать так, что и базовый может быть другой. Т.е. нужен вариант void*, только для функций-членов... |
| Автор: Mad 30.9.2005, 20:18 | ||
без указателя на обьект класса не обойдешся. правда есть два варианта 1. сделать эти функции static (тогда на них можно взять void* указатель) fD((void*)class->function); 2. тут уже нужен указатель на класс и немного asm, просто лубой вызов class->function(); реально преобразуеться в function(class*); Добавлено @ 20:20 А вообщето опиши задаче по потробней (откуда необходимость передавать именно указатель на ф-цию член класса), может просто есть решение общей проблеммы и без указателей на функции ? |
| Автор: BabySG 30.9.2005, 20:22 | ||
| 1) Статик не пройдет, к сожалению (уже подумывал...) 2) Не понял...? Вопрос: как такое реализованно в MFC и их классе CCmdTarget А то я начал ковырять их message map и завяз по самое не балуй... Смысл только уловил, что каждый объект, который реагирует, должен быть наследован от CCmdTarget и как-то все указатели приводятся к его типу. Соответственно: как у них это работает?
Упрощенно: Есть объект, у которого есть окна. В окне нажали на кнопку и вызвалась определенная функция из массива событий. Причем окно даже не знает что/где/зачем. Соотвественно - при создания окна нужно зарегистрировать функцию на событие в этом окне. PS. Вариант, а-ля TurboVision не проходит - системы обработки эвентов нет и не будет. |
| Автор: Mad 30.9.2005, 20:43 | ||||
Тебе под что надо, под MFC или под WinAPI ? |
| Автор: BabySG 30.9.2005, 21:50 |
| MFC мне даром не нужен У меня свои "окна"... |
| Автор: Mad 30.9.2005, 21:59 | ||
что значит это "свои окна" решение задачи, которую ты описал, сильно зависит от архитектуры всего Framework в котором она бедет реализованна. какие либы ты используеш, или чистый WinAPI ? |
| Автор: BabySG 30.9.2005, 23:29 |
| Mad Огромное спасибо за желание помочь! Случайно наткнулся на книженцию Андрея Александреску и там есть решение этой задачи. |
| Автор: Mad 30.9.2005, 23:56 | ||
Ну так выкладывай общий принцып суда, может еще кому поможет (или может нет, тут много постов типа прочитал в книге, а реально не работает |
| Автор: Earnest 1.10.2005, 08:59 | ||||||||||
MFC просто грубо приводит функции-обработчики к нужной сигнатуре. В реализации MS размер указателя на функцию- член равен 4 байтам, также как на "обычную". Соответственно, MFC очень сильно полагается на то, что обработчик будет строго соответствовать требуемой сигнатуре. Если где-то ошибится - потом с отладкой умучаешься. Особенно когда в дебаге работает, а в релизе валится, что запросто. Но это уже А для твоей задачи идеально подходит boost::function + boost::bind. Выглядит примерно так. Сначала обявляешь обработчик с нужной сигнатурой:
т.е. требуется (будет вызываться) функция принимающая 2 параметра (int,double) и возвращающая void. Потом в объект CHandler можно запихнуть все, что угодно - функтор, свободную функцию, функцию-член, хоть виртуальную, хоть нет - без разницы. Даже число ее параметров не должно строго соответствовать (просто нужно правильно написать bind). Допустим, есть такой класс:
Присваиваем:
Вызов - элементарный:
|
| Автор: BabySG 1.10.2005, 12:54 | ||
| Earnest Благодарствую - будем разбираться с boost, а так не хотелось Mad Хм, там целая глава и, собственно, приходят почти к варианту boost:function Сейчас буду пробовать и так и так... Добавлено @ 12:57 Интересно, а если в классе прописать такой вариант:
Что будет в плане производительности? Да и как потом созранить эти указатели в одном массиве....? |
| Автор: Earnest 1.10.2005, 20:41 |
| http://www.rsdn.ru/article/cpp/fastdelegate.xml и реализацию делегатов... |
| Автор: BabySG 1.10.2005, 21:38 | ||||
Спасибо - читал и не раз. Статья действительно шикарная, но хотелось бы большего... Хм... Покумекав немного, пришел к мысли, что мне проще передать структуру в fD(), которая содержит в себе указатель на объект и указатель на функцию-член. Т.е.:
Тем самым мне совершенно плевать, на что там и где указывает + могу сохранить все это дело в массиве/списке и потом порыться там... Мнения? Добавлено: тормоз - только написал и понял, что работать не будет |