![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Есть следующее построение:
Как передать в fD() указатели на fA() и fB()? Если написать в виде Base::* - не катит Это сообщение отредактировал(а) BabySG - 30.9.2005, 20:02 |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
|
|||
|
||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Собственно, только что читал про это недалеко на форуме
Так вот - не катит Классы А и Б - тут упрощенно приведено - их порядка 100... Количество функции - соотвественно.. Не прописывать же каждую в базовый! (Вдобавок - могут иметь одинаковые названия - но разные реализации ) Далее: вопрос может встать так, что и базовый может быть другой. Т.е. нужен вариант void*, только для функций-членов... Это сообщение отредактировал(а) BabySG - 30.9.2005, 20:12 |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
без указателя на обьект класса не обойдешся. правда есть два варианта 1. сделать эти функции static (тогда на них можно взять void* указатель) fD((void*)class->function); 2. тут уже нужен указатель на класс и немного asm, просто лубой вызов class->function(); реально преобразуеться в function(class*); Добавлено @ 20:20 А вообщето опиши задаче по потробней (откуда необходимость передавать именно указатель на ф-цию член класса), может просто есть решение общей проблеммы и без указателей на функции ? |
|||
|
||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
1) Статик не пройдет, к сожалению (уже подумывал...)
2) Не понял...? Вопрос: как такое реализованно в MFC и их классе CCmdTarget А то я начал ковырять их message map и завяз по самое не балуй... Смысл только уловил, что каждый объект, который реагирует, должен быть наследован от CCmdTarget и как-то все указатели приводятся к его типу. Соответственно: как у них это работает?
Упрощенно: Есть объект, у которого есть окна. В окне нажали на кнопку и вызвалась определенная функция из массива событий. Причем окно даже не знает что/где/зачем. Соотвественно - при создания окна нужно зарегистрировать функцию на событие в этом окне. PS. Вариант, а-ля TurboVision не проходит - системы обработки эвентов нет и не будет. Это сообщение отредактировал(а) BabySG - 30.9.2005, 20:28 |
|||
|
||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
Тебе под что надо, под MFC или под WinAPI ? |
||||
|
|||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
MFC мне даром не нужен
У меня свои "окна"... |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
что значит это "свои окна" решение задачи, которую ты описал, сильно зависит от архитектуры всего Framework в котором она бедет реализованна. какие либы ты используеш, или чистый WinAPI ? |
|||
|
||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Mad
Огромное спасибо за желание помочь! Случайно наткнулся на книженцию Андрея Александреску и там есть решение этой задачи. Это сообщение отредактировал(а) BabySG - 30.9.2005, 23:30 |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
Ну так выкладывай общий принцып суда, может еще кому поможет (или может нет, тут много постов типа прочитал в книге, а реально не работает |
|||
|
||||
| Earnest |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
MFC просто грубо приводит функции-обработчики к нужной сигнатуре. В реализации MS размер указателя на функцию- член равен 4 байтам, также как на "обычную". Соответственно, MFC очень сильно полагается на то, что обработчик будет строго соответствовать требуемой сигнатуре. Если где-то ошибится - потом с отладкой умучаешься. Особенно когда в дебаге работает, а в релизе валится, что запросто. Но это уже А для твоей задачи идеально подходит boost::function + boost::bind. Выглядит примерно так. Сначала обявляешь обработчик с нужной сигнатурой:
т.е. требуется (будет вызываться) функция принимающая 2 параметра (int,double) и возвращающая void. Потом в объект CHandler можно запихнуть все, что угодно - функтор, свободную функцию, функцию-член, хоть виртуальную, хоть нет - без разницы. Даже число ее параметров не должно строго соответствовать (просто нужно правильно написать bind). Допустим, есть такой класс:
Присваиваем:
Вызов - элементарный:
-------------------- ... |
||||||||||
|
|||||||||||
| BabySG |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Earnest
Благодарствую - будем разбираться с boost, а так не хотелось Mad Хм, там целая глава и, собственно, приходят почти к варианту boost:function Сейчас буду пробовать и так и так... Добавлено @ 12:57 Интересно, а если в классе прописать такой вариант:
Что будет в плане производительности? Да и как потом созранить эти указатели в одном массиве....? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
-------------------- ... |
|||
|
||||
| BabySG |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 26.9.2005 Репутация: нет Всего: нет |
Спасибо - читал и не раз. Статья действительно шикарная, но хотелось бы большего... Хм... Покумекав немного, пришел к мысли, что мне проще передать структуру в fD(), которая содержит в себе указатель на объект и указатель на функцию-член. Т.е.:
Тем самым мне совершенно плевать, на что там и где указывает + могу сохранить все это дело в массиве/списке и потом порыться там... Мнения? Добавлено: тормоз - только написал и понял, что работать не будет Это сообщение отредактировал(а) BabySG - 2.10.2005, 14:29 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |