| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Помогите с функцией |
| Автор: Riddik 1.6.2009, 15:13 | ||||
| Привет Подскажите, как правильно написасть функцию: есть абстрактный базовый класс Base и несколько производных от него, eсть контейнер vector, содержащий указатели на базовый класс.
Функция нужна такая:
Где obj - наследник базового класса Base. |
| Автор: mrbrooks 1.6.2009, 15:22 |
| Riddik, а почему бы сразу не записывать в вектор производный класс? можно без указателя. |
| Автор: Riddik 1.6.2009, 15:26 |
| Нужно через функцию, потому что pb - это private - член другого класса. Добавлено через 1 минуту и 48 секунд И потому что в векторе будут разные производные классы |
| Автор: REZiaMIX 1.6.2009, 15:54 | ||
Так ? |
| Автор: Riddik 1.6.2009, 16:49 |
| REZiaMIX, неа. Объект нужно создать, его не существует. нужно создать объект и поместить в вектор его адрес : push_back(new obj); |
| Автор: zim22 1.6.2009, 17:32 | ||
Riddik, что-то типа такого?
|
| Автор: Riddik 1.6.2009, 19:53 |
| zim22, спасибо Шаблонная функция мне и нужна |
| Автор: Riddik 1.6.2009, 22:02 |
| Только я не очень понял, почему так работает: add(derived()); а так нет: add(derived); просто нет скобок после имени класса. Компилятор выдаёт ошибку, что этот тип нельзя использовать в качестве выражения. Если можно, объясните. |
| Автор: Riddik 1.6.2009, 22:27 | ||
| Ещё проблема. Объект создаётся дважды. При вызове функции создаётся объект, затем его копия передаётся в вектор - т.е. создаётся объект ещё раз. Как этого избежать? передача по ссылке ничего не меняет. Не знаю, какой делать конструктор копии, чтобы объект не создавался два раза. Мне нужно, чтобы аргумент функции лишь говорил, какой класс положить в вектор. Добавлено через 11 минут и 31 секунду Вот код:
При вызове функции add(der()); вызывается конструктор der(); вызывается конструктор der(); вызывается деструктор ~der(); И после очистки вектора вызывается деструктор ~der(); Можно как-нибудь сделать, чтобы объект создавался только когда его адрес помещается в контейнер, один раз? |
| Автор: Rififi 2.6.2009, 00:42 |
| Riddik, читать про паттерны Factory, Builder, Virtual Constructor, Prototype |
| Автор: zim22 2.6.2009, 07:51 | ||
потому что в случае с круглыми скобками мы конструируем объект. и его тип уже вычисляется при передаче в функцию add это аналогично следующей форме записи:
без круглых скобок - не работает, т.к. форма записи не допустимая. Rififi дело говорит. почитайте про паттерны. |
| Автор: Riddik 2.6.2009, 08:39 |
| Спасибо за помощь |
| Автор: Riddik 2.6.2009, 11:31 |
| mes, мне нужно это: "создавался объект по типу который Вы передаете" Как раз копия мне не нужна! Спасибо! Вы очень помогли! |
| Автор: Riddik 2.6.2009, 12:09 | ||
Ругается на
Пишет 'Derived' : illegal use of this type as en expression, не пойму почему. |
| Автор: azesmcar 2.6.2009, 12:19 |
| Riddik Желательно было бы посмотреть на код. использование template<typename T> вместо template<class T> может помочь |
| Автор: Riddik 2.6.2009, 12:29 | ||
| azesmcar, Не помогло. Что-то я не так сделал. Код уже большой - привожу точный макет проблемного места:
|
| Автор: zim22 2.6.2009, 12:41 | ||
|
| Автор: Riddik 2.6.2009, 13:09 | ||||
| zim22, у меня в точности так. разве только что вместо
у меня
|
| Автор: zim22 2.6.2009, 13:10 | ||
у меня работает. опять наверно из-за различных компиляторов проблема... *** чтобы в gcc работало, нужно определение деструктора вынести за класс
|
| Автор: mes 2.6.2009, 13:12 | ||
т.е. вариант zim22 у Вас не работает ? тогда скажите какой компилятор Вы используйте. Добавлено через 1 минуту и 32 секунды и вообще не понимаю зачем мудрить можно же просто передавать готовый объект на хранение. Вот пример показывающий оба способа. Я бы выбрал второй.
|
| Автор: Riddik 2.6.2009, 13:18 |
| Компилятор VC++ 6.0 Ваш второй способ, скорее всего, в моём случае подойдёт. Сейчас ещё прикину |
| Автор: zim22 2.6.2009, 13:23 |
эээ, без комментариев. на нём ещё мой дедушка программировал |
| Автор: mes 2.6.2009, 13:27 |
берите тогда второй способ и не ищите лишних проблем |
| Автор: Riddik 2.6.2009, 13:45 |
| Есть и експресс 2008, но привычка... Спасибо за всё! |