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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unhandled exception 
:(
    Опции темы
User008
Дата 8.5.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @ 8.5.2012,  14:59)
да. шаблонный класс должен быть определен в каждой единице компиляции (кроме extern, но эта фича пока мало поддерживается)

extern - может имеется в виду export?

Добавлено @ 15:20
Цитата(borisbn @ 8.5.2012,  09:23)
Вот пару вариантов
Код

template< class T = X >
class Y
{
public:
    Y() { x = std::auto_ptr<X>(makeX()); }
    virtual void f() { printf("Y::f"); }
protected:
    virtual X *makeX() const { return new T; }
    std::auto_ptr<X> x;
};

class YD : public Y< XD>
{
public:
    virtual void f() { printf("YD::f"); }
    virtual void ff() {
       printf("YD::ff");
       XD *xd = dynamic_cast<XD *>(x.get());
       if(xd)
          xd->ff();  
    }
};


Код

typedef std::function< X*() > makeX_t;

class Y
{
public:
    Y( makeX_t makeX ) { x = std::auto_ptr<X>(makeX()); }
    virtual void f() { printf("Y::f"); }
protected:
    std::auto_ptr<X> x;
};

class YD : public Y
{
public:
    YD() : Y( [](){ return new XD; } ) {}
    virtual void f() { printf("YD::f"); }
    virtual void ff() {
       printf("YD::ff");
       XD *xd = dynamic_cast<XD *>(x.get());
       if(xd)
          xd->ff();  
    }
};

http://liveworkspace.org/code/659da452574b...d7a462d8403f101

Я правильно понимаю, что второй вариант относится к новому стандарту С++?
А как можно реализовать первый вариант без использования шаблона?
Я озадачен. В примерах, которые я смотрел по фабричному методу, в том числе э. гамма, класс выбирается через параметр конструктора. При этом мне подтвердили, что базовый класс не должен иметь объявления классов полей производных классов.

Это сообщение отредактировал(а) User008 - 8.5.2012, 15:20
PM MAIL   Вверх
baldina
Дата 8.5.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да, конечно))) заговорился
PM MAIL   Вверх
borisbn
Дата 8.5.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(User008 @  8.5.2012,  15:15 Найти цитируемый пост)
Я правильно понимаю, что второй вариант относится к новому стандарту С++?

 smile 
можно и без 11-го
Код

typedef X*(*makeX_t)();

class Y
{
public:
    Y( makeX_t makeX ) { x = std::auto_ptr<X>(makeX()); }
    virtual void f() { printf("Y::f"); }
protected:
    std::auto_ptr<X> x;
};

class YD : public Y
{
public:
    YD() : Y( makeXD ) {}
    virtual void f() { printf("YD::f"); }
    virtual void ff() {
       printf("YD::ff");
       XD *xd = dynamic_cast<XD *>(x.get());
       if(xd)
          xd->ff();  
    }
    static X* makeXD() { return new XD; }
};

http://liveworkspace.org/code/758c42a32336...46e0d98f17bae12

Цитата(User008 @  8.5.2012,  15:15 Найти цитируемый пост)
А как можно реализовать первый вариант без использования шаблона?

там весь смысл в шаблоне... тога уж его (вариант) нужно не реализовать без шаблона, а реализовать по-другому


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
User008
Дата 8.5.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



[QUOTE=borisbn,8.5.2012,  16:04]
Цитата(User008 @  8.5.2012,  15:15 Найти цитируемый пост)

Код

typedef X*(*makeX_t)();

class Y
{
public:
    Y( makeX_t makeX ) { x = std::auto_ptr<X>(makeX()); }
    virtual void f() { printf("Y::f"); }
protected:
    std::auto_ptr<X> x;
};

class YD : public Y
{
public:
    YD() : Y( makeXD ) {}
    virtual void f() { printf("YD::f"); }
    virtual void ff() {
       printf("YD::ff");
       XD *xd = dynamic_cast<XD *>(x.get());
       if(xd)
          xd->ff();  
    }
    static X* makeXD() { return new XD; }
};

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

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

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

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

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


 




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


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

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