0

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

如果我没记错的话,由于它在工厂方法中的性质,存在循环依赖:

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

实际上我实现了一个工厂,我上面有问题,即使我添加了

#ifndef MYCLASS_H
#define MYCLASS_H
#endif

我还在

Compiler Error C2504 'class' : base class undefined

当我从基类标头中删除子类包含时,此错误就会消失。

4

4 回答 4

4

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

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

于 2010-05-06T13:14:31.993 回答
4

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

于 2010-05-06T13:14:49.590 回答
1

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

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

在您收到上面的错误消息中,派生类总是需要知道基类的完整实现。作为设计问题,基类永远不应该知道派生类的任何事情。

于 2010-05-06T13:19:31.500 回答
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();
}

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

于 2010-05-06T13:16:09.740 回答