![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Класс А наследуется от IBase в котором есть метод Get(). В классе А этот метод переопределяется для возвращения конкретных значений. Нижеследующий пример конечно не работает, потому что возвращаемые типы Get() отличаются. А как вообще такое можно сделать.
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
tilin, что значит "не работает"?
что ты от него ожидаешь? допиши, в коде, желательно |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Не работает, значит не компилируется и ругается на то, что разные типы возвращаемых значений у IBase::Get и A::Get.
Чего хочется:
|
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
А где же они будут одинаковыми? void!=T -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
tilin, такое, как ты показал, невозможно
или boost::any или dynamic_cast |
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: 0 Всего: 0 |
Наверное это будет сложно для начинающего. Напиши микро-аналог variant. Что-то типа этого:
Это сообщение отредактировал(а) niXman - 27.10.2009, 15:03 --------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tilin, интересно, а как ты этим пользоваться собирался? Вот например, кусок кода не знает ничего о типе Type, для которого был в другом месте кода создан экземляр класса A<Type>... Так вот, что будет делать твой кусок кода с тем, что вернет A<Type>::Get? Я уж не говорю о том, что это даже теоретически скомпилировать нельзя.
|
|||
|
||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Ну кратко так: A<type> создается в одном месте кода, затем помещается в массив. С массивом работает код, который может например определенным образом сортировать элементы массива, добавлять, удалять и т.д. А где-то из этого массива извлекается значение A<type> и используется. Смысл в том, что тот кто помещает в массив и тот кто извлекает из массива имеют нужную информацию о типах. А массив может содержать конечно только элементы одного типа, отсюда и наследование от единого интерфейса. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
тогда dynamic_cast а если ну совсем уверен, то даже static_cast вниз по иерархии Это сообщение отредактировал(а) Alek86 - 27.10.2009, 15:40 |
|||
|
||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
При получении значения static_cast до требуемого типа вполне подходит. И как я понял других вариантов, кроме как возвращать Variant, нет. Буду делать так. Спасибо. Меня только смущает, что в этом случае требуется создавать временный объект Variant в функции Get(). Это сообщение отредактировал(а) tilin - 27.10.2009, 16:17 |
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: 0 Всего: 0 |
Создай локальный в твоем классе, инициализируй его в функции Get(), и возвращай на него ссылку. --------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
можно использовать паттерн - visitor
|
|||
|
||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Так и сделал. Только не в Get, а сразу при создании объекта. А Get возвращает Вариант. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |