工厂方法和循环依赖

时间:2010-05-06 13:11:27

标签: c++ include compiler-errors factory-pattern

编辑:谢谢大家,现在我看到了我的错误。

如果我没错,因为它在工厂方法中的性质存在循环依赖性:

基类需要知道子类,因为它创建子类,而子类需要知道基类。循环依赖是不好的编程习惯,不是吗?

实际上我实施了一个工厂,我上面有问题,甚至我添加了

#ifndef MYCLASS_H
#define MYCLASS_H
#endif

我还在

Compiler Error C2504 'class' : base class undefined

当我从基类标题中删除子类include时,此错误消失了。

4 个答案:

答案 0 :(得分:4)

工厂不应该是产品的基类。

答案 1 :(得分:3)

解决方案1:不要#include基类头中的派生类头,只能在基类cpp中。工厂方法的声明不应该使用返回的具体类的类型,只能使用基类型。

解决方案2:使用单独的工厂类(或单独类中的工厂方法)来创建对象。然后完全消除循环依赖性。这是首选方式。

答案 2 :(得分:1)

基类永远不需要知道派生类。

您需要重新审视您的模式描述,因为我认为您可能会将几个不同的模式混合在一起:如果您使用它来创建派生类,那么工厂不应该是基类的一部分。如果您只是使用它来创建单个类的各种实例,那么它可能是该类的静态成员。

在上面的错误消息中,派生类总是需要知道基类的完整实现。作为一个设计问题,基类不应该对派生类有任何了解。

答案 3 :(得分:0)

struct Base {
    Base * Create(int param);
};

struct Derived0 : public Base {
};

struct Derived1 : public Base {
};

Base * Base::Create(int param) {
    switch (param) {
    case 0: return new Derived0();
    case 1: return new Derived1();
}

您不应该尝试在Base类定义中实现工厂函数。只需在那里声明它,并在派生类定义之后定义它。