Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> shared_ptr и abstract factory 
:(
    Опции темы
fear
Дата 1.3.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Хочу создать фабрику, которая будет создавать объекты и возвращать shared_ptr на них.
Предпологается что создаваемый объект будет использоваться внутри фабрики и в случае необходимости и вне ее, когда необъодимость в нем исчезнет, память им занимаемая освободиться.

Реализация могла бы быть следующая, только метод create() должен быть виртуальным smile кто подскажет как решить задачу? Фабрика не должна быть шаблоном smile

Код

#include <boost/shared_ptr.hpp>
#include <iostream>

class A
{
  public:
    virtual int func() { return 1; }
};

class B: public A
{
  public:
    virtual int func() { return 2; }
};

class AF
{
  public:
    boost::shared_ptr<A> create() {
      return boost::shared_ptr<A>(new A);
    }
};

class BF: public AF
{
  public:
    boost::shared_ptr<B> create() {
      return boost::shared_ptr<B>(new B);
    }
};

int main()
{
  AF *factory = new BF;
  boost::shared_ptr<A> a = factory->create();
}


PM MAIL   Вверх
azesmcar
Дата 1.3.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Странная фабрика какая-то, и вообще зачем нужно это? Полиморфизм на что придумали, фабрика должна возвращать указатель на базовый класс, и базовый класс должен давать достаточно богатый интерфейс, чтобы использовать его функциональность.

Вот пример реализации фабрики
http://forum.vingrad.ru/forum/topic-266893/hl/factory/0.html
PM   Вверх
fear
Дата 1.3.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



AF и ВF  не совсем фабрика smile
это некие классы которые предназначены для создания в себе объектов классов A и B соответственно и только их
возвращать они должны указатели на управляемые ими объекты

по ссылке счас схожу

PM MAIL   Вверх
azesmcar
Дата 1.3.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(fear @  1.3.2010,  19:16 Найти цитируемый пост)
это некие классы которые предназначены для создания в себе объектов классов A и B соответственно и только их

скромный вопрос, а зачем это нужно? smile для этого надо класс создавать? оператор new не подходит?

Это сообщение отредактировал(а) azesmcar - 1.3.2010, 19:23
PM   Вверх
fear
Дата 1.3.2010, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



azesmcar, давайте про полиморфизм лучше поговоим )))

В данном примере неизменно следующее:
Код

struct I {};
struct A: I {};
struct B: I {};


далее у нас появляется некая фабрика (пусть все же фабрикой будет smile ) и ее наследники
Код

struct F {};
struct AF: F {};
struct BF: F {};


каждый из наследников создает экземпляр некоторого класса:
Код

struct F {
  virtual I *create() = 0;
};

struct AF {
  A *create();
};

struct BF {
  B *create();
};


схема отлично работает, пока не появляются умные указатели,  т.е. сделать так мы не можем
Код

struct F {
  virtual boost::shared_ptr<I> create() = 0;
};

struct AF {
  boost::shared_ptr<A> create();
};

struct BF {
  boost::shared_ptr<B> create();
};


а так хочется ))) чтобы умные указатели вели себя аналогично глупым стандартным smile
PM MAIL   Вверх
mes
Дата 2.3.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(fear @  1.3.2010,  22:01 Найти цитируемый пост)
давайте про полиморфизм 

Цитата(fear @  1.3.2010,  22:01 Найти цитируемый пост)
чтобы умные указатели вели себя аналогично 

поможет паттерн bridge, проявление которого может быть как минимум в двух вариантах, хоть и одинаковых по сути : 
 изменить классы под идиологию PImpl  или создать адаптер контролирующий cloneable-поведение доверенного объекта



--------------------
PM MAIL WWW   Вверх
SenkraD
Дата 2.3.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



fear,  ну могу сказать:
   - возвращайте указатели на классы и после ретурна вяжите их в smart_ptr
   - возвращайте boost::shared_ptr<I> и если нуно поработать как с потомком,
     то юзайте boost::shared_polymorphic_downcast
   - может подойдёт CRTP?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 2.3.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



[offtop]mes,  я онимаю зачем адаптер и в принципе поддерживаю,
но я не совсем понял как тут Pimpl поможет?[/offtop]



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
mes
Дата 2.3.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SenkraD @  2.3.2010,  12:32 Найти цитируемый пост)
но я не совсем понял как тут Pimpl поможет

так же, касательно этой темы по сути одно и то же, просто взгляд с разных сторон.
Нам надо разделить обязанности на  две роли :
1. полиморфное поведение 
2. копирование на основе клонирования
в случае с адаптером сам объект выполняет первую роль, а адаптер вторую.
в pimpl же объекту достается 2я роль, а за поведение отвечает имплементация.

 



--------------------
PM MAIL WWW   Вверх
fear
Дата 2.3.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата

- возвращайте указатели на классы и после ретурна вяжите их в smart_ptr

фабрика F создает объект I, один указатель на него она хранит у себя (чтобы работать с объектом); второй отдает наружу (если в нем есть необъодимость); поэтому и используются shared_ptr и поэтому вязать снаружи нельзя, ну или не красиво

Цитата

- возвращайте boost::shared_ptr<I> и если нуно поработать как с потомком, то юзайте boost::shared_polymorphic_downcast

на этот вариант пока что и ставка

Цитата

- может подойдёт CRTP? 

что это? ))

mess, можете привести пример кода как в данном случае может помоч pimpl или bridge?
PM MAIL   Вверх
SenkraD
Дата 2.3.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



fear, звини щас накидать тебе под твоё времени нет,
но ты пока почитай это и это и если не разберёшся, то маякуй подумаем вместе



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
fear
Дата 2.3.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



mess, речь о чем то похожем?

Код

template <typename T>
struct Y
{
    T create() = 0;
};

template <typename T, typename Factory>
struct X: Y<T>
{
    X() :f(new Factory) {}
    T create() {
      return f->create();
    }
    
    Factory *f;
};

struct AF: Y<A>
{
    boost::shared_ptr<A> create() {...};
};

struct AF: Y<B>
{
    boost::shared_ptr<B> create() {...};
};


все хорошо, но мне нужен не шаблонный базовый класс фабрики
PM MAIL   Вверх
mes
Дата 2.3.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(fear @  2.3.2010,  15:38 Найти цитируемый пост)
но мне нужен не шаблонный базовый класс фабрики 

Ну прежде всего Вы не там сконцентрировали внимание.. проблема у Вас не в фабрике, а в shared_ptr для полиморфного объекта..
т.е. в shared_ptr<Base> вы не можeте хранить полиморфнo например  объект Derived.

что то в торопях глупость сморозил.. 
Добавлено @ 17:13
Цитата(fear @  2.3.2010,  15:15 Найти цитируемый пост)
mess

Вобще то mes, без всяких двойных ss иначе из моего ника получается беспорядок  smile 


Это сообщение отредактировал(а) mes - 2.3.2010, 18:00


--------------------
PM MAIL WWW   Вверх
SenkraD
Дата 2.3.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



Цитата(mes @  2.3.2010,  17:11 Найти цитируемый пост)
т.е. в shared_ptr<Base> вы не можeте хранить полиморфнo например  объект Derived.
Это почему вдруг? - Нормально он с полиморфными обьектами работает.

fear,  у тебя фабрика создает обьект, потом тебе его нужно отконфижить
и прокинуть дальше, а потом с ним работают через интерфейс базового класса?
Или у тебя есть перегруженные функции, которым передаются результат фабричного
метода
Код
void foo(A*);
void foo(b*);

// и где-то в коде
foo(someConcreteFactory.create());
?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
mes
Дата 2.3.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



...

Это сообщение отредактировал(а) mes - 2.3.2010, 17:30


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0905 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.