![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
Хочу создать фабрику, которая будет создавать объекты и возвращать shared_ptr на них.
Предпологается что создаваемый объект будет использоваться внутри фабрики и в случае необходимости и вне ее, когда необъодимость в нем исчезнет, память им занимаемая освободиться. Реализация могла бы быть следующая, только метод create() должен быть виртуальным ![]() ![]()
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Странная фабрика какая-то, и вообще зачем нужно это? Полиморфизм на что придумали, фабрика должна возвращать указатель на базовый класс, и базовый класс должен давать достаточно богатый интерфейс, чтобы использовать его функциональность.
Вот пример реализации фабрики http://forum.vingrad.ru/forum/topic-266893/hl/factory/0.html |
|||
|
||||
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
AF и ВF не совсем фабрика
![]() это некие классы которые предназначены для создания в себе объектов классов A и B соответственно и только их возвращать они должны указатели на управляемые ими объекты по ссылке счас схожу |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
fear |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
azesmcar, давайте про полиморфизм лучше поговоим )))
В данном примере неизменно следующее:
далее у нас появляется некая фабрика (пусть все же фабрикой будет ![]()
каждый из наследников создает экземпляр некоторого класса:
схема отлично работает, пока не появляются умные указатели, т.е. сделать так мы не можем
а так хочется ))) чтобы умные указатели вели себя аналогично глупым стандартным ![]() |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
поможет паттерн bridge, проявление которого может быть как минимум в двух вариантах, хоть и одинаковых по сути : изменить классы под идиологию PImpl или создать адаптер контролирующий cloneable-поведение доверенного объекта |
|||
|
||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
fear, ну могу сказать:
- возвращайте указатели на классы и после ретурна вяжите их в smart_ptr - возвращайте boost::shared_ptr<I> и если нуно поработать как с потомком, то юзайте boost::shared_polymorphic_downcast - может подойдёт CRTP? |
|||
|
||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
[offtop]mes, я онимаю зачем адаптер и в принципе поддерживаю,
но я не совсем понял как тут Pimpl поможет?[/offtop] |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так же, касательно этой темы по сути одно и то же, просто взгляд с разных сторон. Нам надо разделить обязанности на две роли : 1. полиморфное поведение 2. копирование на основе клонирования в случае с адаптером сам объект выполняет первую роль, а адаптер вторую. в pimpl же объекту достается 2я роль, а за поведение отвечает имплементация. |
|||
|
||||
fear |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
фабрика F создает объект I, один указатель на него она хранит у себя (чтобы работать с объектом); второй отдает наружу (если в нем есть необъодимость); поэтому и используются shared_ptr и поэтому вязать снаружи нельзя, ну или не красиво
на этот вариант пока что и ставка
что это? )) mess, можете привести пример кода как в данном случае может помоч pimpl или bridge? |
||||||
|
|||||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
||||
|
||||
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
mess, речь о чем то похожем?
все хорошо, но мне нужен не шаблонный базовый класс фабрики |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Ну прежде всего Вы не там сконцентрировали внимание.. проблема у Вас не в фабрике, а в shared_ptr для полиморфного объекта.. т.е. в shared_ptr<Base> вы не можeте хранить полиморфнo например объект Derived. что то в торопях глупость сморозил.. Добавлено @ 17:13 Вобще то mes, без всяких двойных ss иначе из моего ника получается беспорядок ![]() Это сообщение отредактировал(а) mes - 2.3.2010, 18:00 |
|||
|
||||
SenkraD |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
fear, у тебя фабрика создает обьект, потом тебе его нужно отконфижить и прокинуть дальше, а потом с ним работают через интерфейс базового класса? Или у тебя есть перегруженные функции, которым передаются результат фабричного метода
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
...
Это сообщение отредактировал(а) mes - 2.3.2010, 17:30 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
слишком мало деталей Вы сказали, но для приведенной немного выше проблемы, могло быть такое решение :
|
|||
|
||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Честно говоря я тоже не понял, почему. shared_ptr просто обёртка над обычным указателем. Главное что-бы базовый класс(интерфейс) имел открытый виртуальный деструктор... Добавлено @ 19:33 Всё же PIMPL это вот так: header.hpp
source.cpp
usercode.cpp
В результате, в usercode.cpp, даже компилятор не видит имена из Impl. Полноценная инкапсуляция. Это сообщение отредактировал(а) Леопольд - 2.3.2010, 19:36 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |