![]() |
|
Модераторы: bsa |
![]()
|
|
| Riddik |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Привет
Подскажите, как правильно написасть функцию: есть абстрактный базовый класс Base и несколько производных от него, eсть контейнер vector, содержащий указатели на базовый класс.
Функция нужна такая:
Где obj - наследник базового класса Base. |
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
Riddik, а почему бы сразу не записывать в вектор производный класс? можно без указателя.
|
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Нужно через функцию, потому что pb - это private - член другого класса.
Добавлено через 1 минуту и 48 секунд И потому что в векторе будут разные производные классы |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Так ? -------------------- ![]() |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
REZiaMIX, неа. Объект нужно создать, его не существует. нужно создать объект и поместить в вектор его адрес : push_back(new obj);
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Riddik, что-то типа такого?
Это сообщение отредактировал(а) zim22 - 1.6.2009, 17:35 |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
zim22, спасибо
Шаблонная функция мне и нужна |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Только я не очень понял, почему так работает:
add(derived()); а так нет: add(derived); просто нет скобок после имени класса. Компилятор выдаёт ошибку, что этот тип нельзя использовать в качестве выражения. Если можно, объясните. |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Ещё проблема. Объект создаётся дважды. При вызове функции создаётся объект, затем его копия передаётся в вектор - т.е. создаётся объект ещё раз.
Как этого избежать? передача по ссылке ничего не меняет. Не знаю, какой делать конструктор копии, чтобы объект не создавался два раза. Мне нужно, чтобы аргумент функции лишь говорил, какой класс положить в вектор. Добавлено через 11 минут и 31 секунду Вот код:
При вызове функции add(der()); вызывается конструктор der(); вызывается конструктор der(); вызывается деструктор ~der(); И после очистки вектора вызывается деструктор ~der(); Можно как-нибудь сделать, чтобы объект создавался только когда его адрес помещается в контейнер, один раз? |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
Riddik,
читать про паттерны Factory, Builder, Virtual Constructor, Prototype |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
потому что в случае с круглыми скобками мы конструируем объект. и его тип уже вычисляется при передаче в функцию add это аналогично следующей форме записи:
без круглых скобок - не работает, т.к. форма записи не допустимая. Rififi дело говорит. почитайте про паттерны. |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Спасибо за помощь
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Вы хотите чтоб создавался объект по типу который Вы передаете или как копия объекта. Если первое, то
Для второго случая преимущество в том, что можно использовать любой необходимый конструктор (а потом просто снимется копия). Но ваша конструкция мне внушает опасения, мне кажется Вы идете неправильным путем. Если не секрет зачем Вам такое понадобилось ? Зачем нужно клонировать объект ? Это сообщение отредактировал(а) mes - 2.6.2009, 09:41 |
||||
|
|||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
mes, мне нужно это: "создавался объект по типу который Вы передаете"
Как раз копия мне не нужна! Спасибо! Вы очень помогли! |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Ругается на
Пишет 'Derived' : illegal use of this type as en expression, не пойму почему. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |