多文件工厂方法[重复]

Posted

技术标签:

【中文标题】多文件工厂方法[重复]【英文标题】:Multi-file Factory method [duplicate] 【发布时间】:2021-07-11 14:48:53 【问题描述】:

有两个类BaseDerivedBase.h

class Base 
public:
Base* create_obj();
;

还有Base.cpp

#include "Base.h"
Base* Base::create_obj() 
   return new Derived();
;

Derived.h

#inlcude "Base.h"
class Derived : public Base 
;

如果这两个类都在main.cpp 中,那么就不会出错。但是当我把它们放在上面的多个文件中时,我得到了这个错误:

Cannot initialize return object of type 'Base *' with an rvalue of type 'Derived *'

这是为什么呢?我该如何解决这个错误?

【问题讨论】:

为什么Base.h 包含Derived.h 我更正了它,尽管它是类似问题的解决方案,并且我将它包括在内,所以你知道它不是解决方案 【参考方案1】:

你可以试试这个

// Base.h

class Base 
public:
Base* create_obj();

;

// Base.cpp
#include "Base.h"
#include "Derived.h"

Base* Base::create_obj() 
   return new Derived();
;


// Derive.h
class Derived : public Base 
;

基本上我从“Base.h”中删除了“Derive.h”并将其移至“Base.cpp”。由于您没有在标题中派生,因此没有真正需要它。

这称为循环依赖,其中您有一个头文件试图包含另一个文件,但它本身需要包含在该头文件中。

在您的情况下,只需使用 .cpp 文件中的标头而不是 .h 即可打破这种依赖关系。如果您还需要在标头中引用它,您可以使用前向声明。

【讨论】:

您还需要在Derived.h 中包含Base.h。我怀疑这是询问者的确切代码,因为它应该在抱怨Derived* 不能转换为Base* 之前抱怨Base 不是一种类型。 是的,这解决了我的问题。谢谢。但我会等待回答为什么?问题 抱歉,我忘记在 Derived 中包含 Base。我纠正了它。 @内森皮尔森 @Learner 我已经更新了原因。希望这会有所帮助。

以上是关于多文件工厂方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

工厂、抽象工厂和工厂方法

工厂模式——工厂方法模式

工厂方法模式

java设计模式—多工厂模式

工厂方法与抽象工厂

工厂方法模式和简单工厂模式的选折