Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含来自不同库的_C++_Include - Fatal编程技术网

C++ 包含来自不同库的

C++ 包含来自不同库的,c++,include,C++,Include,我必须创建一个工厂方法,它可以从不同的lib创建对象。我的目录树如下所示: libA/src/… libB/src/… libC/src/… src/ libA、libB等是分开编译的 让工厂类位于libA/src/factory.h中。它应该从libB/src/someclass.h创建一个对象 如果我在Factory.h中包含.././libB/src/someclass.h,那么libA无法编译,因为它无法从someclass.h中找到包含项(comiler在libA/src中查找它们,但

我必须创建一个工厂方法,它可以从不同的lib创建对象。我的目录树如下所示:

libA/src/…
libB/src/…
libC/src/…
src/

libA、libB等是分开编译的

让工厂类位于libA/src/factory.h中。它应该从libB/src/someclass.h创建一个对象

如果我在Factory.h中包含.././libB/src/someclass.h,那么libA无法编译,因为它无法从someclass.h中找到包含项(comiler在libA/src中查找它们,但它们在libB/src中)。如果我不包含,它不知道someclass,因此我无法创建它的实例


有什么解决办法吗

您正在寻找向前声明:在类只需要知道类型的头中,使用
class-AFactory声明它而不是包括整个工厂。h

编辑


在重新阅读您的问题之后,我发现您希望单独编译库这一事实与libA工厂必须知道libB类这一事实之间存在矛盾。您不能单独编译,因此我只需提供所有必要的目录路径以包含路径。

您正在寻找向前声明:在类只需要知道类型的头中,使用
class AFactory声明它而不是包括整个工厂。h

编辑


在重新阅读您的问题之后,我发现您希望单独编译库这一事实与libA工厂必须知道libB类这一事实之间存在矛盾。您无法单独编译,因此我只需提供所有必要的目录路径来包含path。

我试图重现此错误,但我的示例使用相同的目录结构,效果很好

#ifndef FACTORY_H_
#define FACTORY_H_


#include "../../libB/src/Someclass.h"


class Factory {
public:
    Factory();
    virtual ~Factory();
};

#endif /* FACTORY_H_ */

当存在直接依赖关系时,如何分别编译它们?也许你想使用一个静态链接库。请解释一下你的意图

我试图重现这个错误,但我的示例使用了相同的目录结构,效果很好

#ifndef FACTORY_H_
#define FACTORY_H_


#include "../../libB/src/Someclass.h"


class Factory {
public:
    Factory();
    virtual ~Factory();
};

#endif /* FACTORY_H_ */

当存在直接依赖关系时,如何分别编译它们?也许你想使用一个静态链接库。请解释一下你的意图

不是类应该知道工厂,工厂应该知道(也应该使用)类。因为工厂必须使用它们,所以远期声明是不够的。接受这一点,它是有效的,但我正在寻找其他解决方案,因为LIB不能相互依赖。现在我想我应该修改一下我的结构。不是类应该知道工厂,工厂应该知道(也应该使用)类。因为工厂必须使用它们,所以远期声明是不够的。接受这一点,它是有效的,但我正在寻找其他解决方案,因为LIB不能相互依赖。现在我想我应该修改一下我的结构。在这个例子中,libB/src中应该有一个类似于Anotherclass.h的东西,在Someclass.h中有一行#include“Anotherclass.h”,每个lib*文件夹都有自己的makefile,最后我可以用开关选择应该链接到最终二进制文件的内容。好吧,让我们说你的“make”构建了“one”一次一个目录。编译器将收集标题中提到的所有包含的文件,并使用默认设置构建一个静态lib-oder二进制文件。因此,如果您“创建”您的工厂,那么将收集所有包含的文件和头文件,以及所有使用的实现文件(整个依赖关系树)。我看没问题,只要你没有。但也许那不是你想要的。在这个例子中,libB/src中应该有一个类似Anotherclass.h的东西,Someclass.h中应该有一行#include“Anotherclass.h”。每个lib*文件夹都有自己的makefile,最后我可以用开关选择应该链接到最终二进制文件的内容。好的,让我们说一下“make”构建每次“一个”目录。编译器将收集标题中提到的所有包含的文件,并使用默认设置构建一个静态二进制文件库。因此,如果您“创建”工厂,将收集所有包含的文件和标题文件,以及所有使用的实现文件(整个依赖关系树).只要你没有,我看没问题。但也许那不是你想要的。重新考虑一下你之前想要的项目结构。