我想知道是否有人可以帮助我。
假设我有一些类如下:
class A { ... };
class B : public A { ... }
class C : public A { ... };
class D { ... };
class E : public D { ... };
class F : public D { ... };
现在我希望类B有一个E类型的对象作为成员,C类要有一个F类型的对象作为成员。
是否有一个很好的设计模式,我可以在类A中使用某种类型的基类指针,然后在类B中创建一个新的E,在类C中创建一个新的F.我想知道抽象工厂是否类似?
我希望这不会太混乱......没有UML图表很难解释!
答案 0 :(得分: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
?
也许如果你编辑你的问题以更好地解释你的目标,那么我们可以提供更有见地的答案。
答案 1 :(得分: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> { };
请注意,由于covariant return types,AImpl::getD()
可以返回T*
。
答案 2 :(得分:0)