编辑:谢谢大家,现在我看到了我的错误。
如果我没错,因为它在工厂方法中的性质存在循环依赖性:
基类需要知道子类,因为它创建子类,而子类需要知道基类。循环依赖是不好的编程习惯,不是吗?
实际上我实施了一个工厂,我上面有问题,甚至我添加了
#ifndef MYCLASS_H
#define MYCLASS_H
#endif
我还在
Compiler Error C2504 'class' : base class undefined
当我从基类标题中删除子类include时,此错误消失了。
答案 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类定义中实现工厂函数。只需在那里声明它,并在派生类定义之后定义它。