【问题标题】:Factory Method and Cyclic Dependency工厂方法和循环依赖
【发布时间】:2010-05-06 13:11:27
【问题描述】:

编辑:谢谢各位,现在我明白我的错误了。

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

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

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

#ifndef MYCLASS_H
#define MYCLASS_H
#endif

我还在继续

Compiler Error C2504 'class' : base class undefined

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 考虑到最佳实践,我想第二种方法更好,不是吗?
    • @metdos,它是 - 在我的答案的最新版本中,我添加了一个句子来说明这一点。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      在您收到的上述错误消息中,派生类始终需要了解基类的完整实现。作为设计问题,基类永远不应该知道派生类的任何信息。

      【讨论】:

        【解决方案4】:
        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();
        }
        

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

        【讨论】:

        • 他的问题与将每个子类放在单独的 cpp/h 文件中有关。
        • @Salgar。是的,它们是,我应该保持这种状态吗?
        • 您在 Base::Create() 中已知 Derived0 和 Derived1,因此如果您从中派生更多类,则需要更改 Base。该函数需要从 Base 中移出。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多