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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактная фабрика, создание объектов 
V
    Опции темы
xTr1m
Дата 28.12.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени всем. Изучая данный паттерн по одному из примеров получил код (шаблонная фабрика)
Код

template <class Base>
class AbstractClassCreator
{
public:

    virtual Base* Create() = 0;
    virtual ~AbstractClassCreator(){}
};

template <class C, class Base>
class ClassCreator : public AbstractClassCreator<Base>
{
public:

    virtual Base* Create() { return new C(); };
};

template <class ID, class Base>
class CCarFactory
{
    map<ID, AbstractClassCreator<Base>*> m_factory;

public:

    template <class T>
    void Add(ID carName)
    {
        map<ID, AbstractClassCreator<Base>*>::const_iterator It = m_factory.find(carName);
        if(It == m_factory.end())
        {
            m_factory[carName] = new ClassCreator<T, Base>();
        }
    };

    Base* Create(ID carName)
    {
        map<ID, AbstractClassCreator<Base>*>::const_iterator It = m_factory.find(carName);
        if(It != m_factory.end())
            return It->second->Create();
    };
};

class Car
{

};

class Ford : public Car
{

};

class Honda : public Car
{

};

int _tmain(int argc, _TCHAR* argv[])
{
    CCarFactory<int, Car> factory;

    factory.Add<Honda>(1);
    factory.Add<Ford>(2);

    Honda *h = factory.Create(1);
        
    return 0;
}


на что получаю ошибку о том, что error C2440: 'initializing' : cannot convert from 'Car *' to 'Honda *' И в общем то оно и понятно. А как тогда создают объекты? Или для создания нельзя делать шаблонную фабрику, а нужно делать фабрику для каждого конкретного вида машины (в моей случае)? 
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 28.12.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тут конечно можно использовать привидение в стиле dynamic_cast, но это ведь вроде тоже не есть очень хорошо
PM MAIL WWW ICQ   Вверх
bsa
Дата 28.12.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



dynamic_cast у тебя работать не будет, так как класс Car не виртуальный (нужен хотя бы один виртуальный метод, в первую очередь деструктор).
можно использовать static_cast, но только в том случае, если ты АБСОЛЮТНО УВЕРЕН в совместимости указателей (другими словами, если ты проверил соответствие перед преобразованием).
PM   Вверх
xTr1m
Дата 28.12.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Про деструктор я знаю. Допустим он там все-таки есть =)) Вопрос при этом остается. Dynamic_cast только поможет в таком случае?
PM MAIL WWW ICQ   Вверх
bsa
Дата 28.12.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



xTr1m, ты полностью мое сообщение прочитал или только про виртуальный деструктор?
PM   Вверх
xTr1m
Дата 28.12.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну дело не в применении "*_cast", меня больше интересует сам подход. Хорошо задам вопрос по-другому, как создают разные объекты (отнаследованные от одного конечно) при помощи шаблонной фабрики (кроме как через cast)?
PM MAIL WWW ICQ   Вверх
mes
Дата 28.12.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



xTr1m, без каста никак нельзя.. плохо когда каст разбросан по коду, а если в одном месте сгрупирован, то все ок smile

Добавлено через 4 минуты и 18 секунд
xTr1m, у вас в примере идет отражение типа на интегральное значение.. и в последствии создание объекта по значению.. система типов "нарушена" (точнее) 
Вы с вашей фабрикой взяли на себя ответсвенность за соблюдение типосовместимости и _cast Вам в помощь..

Добавлено через 7 минут и 11 секунд
алсо слабым местом в вашем паттерне является не сам каст, а  безконтрольная типозависимость..

Цитата(xTr1m @  28.12.2011,  10:00 Найти цитируемый пост)
    factory.Add<Honda>(1);
    factory.Add<Ford>(2);
    
   Honda *h = factory.Create(1);


Добавлено через 8 минут и 10 секунд
т.е. непонятно откуда взявшаяся связь между значениями и типами, позволяющая легко ошибится и трудно найти ошибку.. 



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


Опытный
**


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

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



Понял. Хотя как каст будет в одном месте не понятно. Ведь Create может вызываться из разных мест. Или тут уже другие трюки идут в ход?

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


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


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

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



Цитата(xTr1m @  28.12.2011,  10:00 Найти цитируемый пост)
template <class ID, class Base>
class CCarFactory

оффтопик, в этом месте по логике класс должен называться просто CFactory, ибо берет простого креатора и шаблоный параметр класса который будет создавать..

Добавлено через 37 секунд
Цитата(xTr1m @  28.12.2011,  12:07 Найти цитируемый пост)
Или тут уже другие трюки идут в ход?

да другие, оррганизация зависимости значения от типа.. 



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


Опытный
**


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

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



Да, тут уже торопился. Большое спасибо.
PM MAIL WWW ICQ   Вверх
mes
Дата 28.12.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вот на скорую руку :
http://liveworkspace.org/code/d1bef0c41a01...4472282f77edda5

Добавлено через 9 минут и 11 секунд
что при легком допиливании превращается в :
http://liveworkspace.org/code/0895c4ad8770...39818453ecae50f


--------------------
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.0573 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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