![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Vovkin |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 10.1.2007 Репутация: нет Всего: нет |
Помогите зазобраться ка сделать.
Есть некоторый класс описанный в виде
В общем в классе есть указатель на функцию, которая дергается, если в классе происходят какие либо действия. Есть второй класс
В общем класс, в котором есть объекс класса А и некоторая функция. Вопрос. Как мне для объекта MyA присвоить его указателю Func указательфункции MyFunc изкласса B. Т.е. провернуть нечто следующее
Весь смысл в том, что мне нужно дергать метод класса, который не является потомком другого класса. (В данном примере В не потомок А.) А просто в этом классе есть объект другого класса. Компилятор настойчиво просит писать так
При этом все компилируется, но работает неправильно. Т.к. присваивается не указатель моего созданного класса В, а создется где-то внутри пустой класс В и дергается его метод MyFunc. Вот и спрашиваю как мне праивльно сделать? Да у меня Visual Studio 2008. |
||||||||
|
|||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Почитай про boost::function - найдешь решение
![]() |
|||
|
||||
J0ker |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
я вам не верю компилятор это не скомпилирует, т.к. MyA->Func и &B::MyFunc - имеют разные типы, которые не конвертируются имплиситли. это будет работать только так
во-первых, ваше понимание механизма в корне не правильно во-вторых такое использование функций-мемберов грозит тяжелыми осложнениями с возможным летальным исходом вообще надо взять за правило, что всякое явное преобразование типов (за некоторым исключением dynamic_cast'ов) - указывает на неправильный дизайн. Это сообщение отредактировал(а) J0ker - 13.10.2008, 23:33 |
||||||||
|
|||||||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
потому-что явное лучше неявного
![]() |
|||
|
||||
Vovkin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 10.1.2007 Репутация: нет Всего: нет |
Ну да. Именно так. Я просто опустил часть записи. Собственно я уже сделал по простоту с использованием статических методов и передачей среди параметров указателя на объект. Просто и без заморочек. Все заработало как надо. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
a почему не сделать примерно так? :
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
это неправильный аргумент в подавляющем большинстве случаев (как в вышеуказанном) компилятор не пропустит преобразование типов, которое может привести к нежелательным последствиям |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Наверное, потому, что альтернативой такому "неправильному дизайну" будет более громоздкий и менее удобочитаемый код. Например, все временные объекты, создаваемые выражениями вида T(expression-list), придётся делать именованными переменными (ну и зачем это нужно?). |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
почему все??? при наличии имплисит преобразования все пройдет нормально. При отсутствии оного - вместо тупого каста надо подумать что тут что-то не так. Безусловно бывают исключения (например ambiguous), но в C++ их все-таки постарались свести к минимуму, и на возмущения компилятора лучше обратить более пристальное внимание... Это сообщение отредактировал(а) J0ker - 13.10.2008, 23:03 |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
||||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
ну не будьте занудой ![]() вы отлично понимаете о чем я говорю приведенный вами пример - особый случай особо оговоренный стандартом - данное преобразование эквивалентно конструированию временного объекта - так-же как и имплисит преобразование. |
||||
|
|||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Кстати, раз уж в другой теме мы про исключения заговорили... Когда мы пишем
мы тоже юзаем преобразовани типа. Тут тоже неправильный дизайн? Это сообщение отредактировал(а) UnrealMan - 13.10.2008, 23:27 |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |