2011-01-19 4 views
1

Мне было интересно, может ли кто-нибудь помочь мне.Design Pattern advice

Пусть у меня есть некоторые классы следующим образом:

Теперь я хочу, класс B, чтобы объект типа Е в качестве члена и класса C, чтобы иметь объект типа F в качестве члена.

Есть ли хороший шаблон дизайна, в котором у меня может быть какой-то базовый указатель на класс D в классе A, а затем создать новый E в классе B и новый F в классе C. Мне было интересно, похоже ли абстрактная фабрика ?.

Надеюсь, это не слишком запутывает ... Трудно объяснить без UML-диаграмм !.

+0

Отформатирован код. Пожалуйста, сделайте это самостоятельно в будущих сообщениях. –

+1

Похоже, вы должны пересмотреть свой дизайн. – Falmarri

+0

Извините, Джон - сделаю. – Mewzer

ответ

2

Что случилось с тем, что вы делали именно так, как говорите?

class A 
{ 
    A(D* p) : ptr(p) {} 
    D* ptr; 
}; 

class B : public A 
{ 
    B() : A(new E) {} 
}; 

class C : public A 
{ 
    C() : A(new F) {} 
}; 

Если вы хотите автоматизировать его немного лучше, вы можете использовать промежуточный класс шаблонов.

class A 
{ 
    virtual D* getD(); 
}; 

template <class T> 
class AImpl : public A 
{ 
    AImpl() : m_d(new T) {} 
    T* getD() { return m_d; } 
    T* m_d; 
}; 

class B : public AImpl<E> { }; 

class C : public AImpl<F> { }; 

Обратите внимание, что AImpl::getD() может вернуться T* из-за covariant return types.

+1

Это не CRTP. CRTP означает предоставление самого класса в качестве параметра шаблона шаблону класса, используемому в качестве базы. Вы поставляете некоторый другой класс в качестве параметра шаблона к шаблону класса, используемому в качестве базы. –

+0

Да, ты прав. По какой-то причине это показалось мне как CRTP, и я даже не думал об этом. Я исправлю это. Приветствия. –

2

Вы можете сделать именно это:

class D 
{ 
public: 
    D(const A *p) : p_(p) {} 
    virtual ~D() { delete p_; } 
private: 
    const A *p_; 
}; 

class E : public D 
{ 
public: 
    E() : D(new B) {} 
}; 

Есть много лучше подхода к этому, в зависимости от того, что вы пытаетесь достичь. Например, почему D должен содержать указатель на A?

Возможно, если вы отредактируете свой вопрос, чтобы лучше объяснить свою цель, тогда мы сможем дать более глубокие ответы.

+0

Falmarri сказал, что я должен пересмотреть свой дизайн. Считаете ли вы, что это хорошая практика или вы бы порекомендовали другой подход? – Mewzer

+0

@Mewzer: Я не могу сказать, поскольку я не знаю, какова ваша цель. –

+1

Вы не получили выводить E из D в код? – bjskishore123

 Смежные вопросы

  • Нет связанных вопросов^_^