Дизайн шаблона совет - PullRequest
       16

Дизайн шаблона совет

1 голос
/ 20 января 2011

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

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

class A { ... };

class B : public A { ... }

class C : public A { ... };

class D { ... };

class E : public D { ... };

class F : public D { ... };

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

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

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

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Что плохого в том, чтобы делать точно так, как вы говорите?

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* благодаря ковариантным типам возврата .

2 голосов
/ 20 января 2011

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

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 голосов
/ 20 января 2011

как насчет шаблона Composite Design?

http://en.wikipedia.org/wiki/Composite_pattern

...