![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
lanz |
![]()
Сообщение
#1
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
В общем суть такова, есть некоторое количество(N) классов, наследующих от общего предка.
У предка есть интерфейс управления для обработки команд. Раскрывающийся текст
Естественно конкретные реализации по разному обрабатывают команды. В первом приближении примерно так: Раскрывающийся текст
Естественно это не очень красиво, поэтому сразу второе приближение: Раскрывающийся текст
В map хранятся указатели на функции члены. Естественно мне захотелось вынести все это в базовый класс. Раскрывающийся текст
Загвоздка в том что мы не можем добавлять функции-члены наследующих классов в список. Можно конечно обойтись списком свободных функций, но интересно, как описать Map который будет содержать функции члены не только базового но и производных классов? |
|
|
![]() |
lanz |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Вот так и описать. Не выходит. Цитата error C2647: '.*' : cannot dereference a 'void (__thiscall DerivedN::* )(QVariant)' on a 'Base' error C2440: 'newline' : cannot convert from 'Base *' to 'DerivedN *' Так понимаю поскольку это downcast, он отказывается неявно его преобразовывать, и в принципе правильно. Цитата А еще я бы предложил подумать вот над чем: по-моему, тут как раз на схему обработки очень хорошо ляжет паттерн "Посетитель" (Visitor). Посетитель не очень подходит ИМХО, поскольку у каждого наследника есть 3-15 уникальных для него команд. Или я неправильно понимаю Посетителя или он нужен когда одну и ту же команду можно применить к объектам разного типа. |
|
|
Влад |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
Так понимаю поскольку это downcast, он отказывается неявно его преобразовывать, и в принципе правильно. И это правильно. Но в наследнике-то ты уже точно знаешь, с объектом какого именно класса ты работаешь; поэтому что мешает downcast'ить "ручками"? Или я чего-то не понимаю? Если так, попробуй накидать код минимального примера, иллюстрирующего проблему, - попробуем разобраться "на кошках". |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 12.7.2025, 0:50 |