我的问题是关于c ++中的包含。想象一下这3个.h文件
// A.h
#include "B.h"
class A {
B b;
}
// B.h
#include "C.h"
class B {
C c;
}
// C.h
class C {
}
这里的问题是,A.h需要访问B.h,而不是C.h。
A.h可以在这种情况下通过B.h访问C.h,所以这是一个不必要的包含。最近我一直处于这种状况,所以我想知道如何避免这种情况。
答案 0 :(得分:3)
这里的问题是,A.h需要访问B.h,而不是C.h。
您的代码中没有不必要的包含。 A.h
不需要直接包含C.h
,但A.h
无法(间接)也不能B.h
使用C.h
答案 1 :(得分:1)
首先;在许多情况下,您不需要完全定义类型(仅使用指针或对它的引用或将其用作返回值时)。在这些情况下,您可以使用前向声明而不是包含完整标头。 其次;如果你的标题有适当的包含警卫,那么多次包括它们的费用很少。
我知道没有好的工具可以找到不需要的内容(谷歌"包括您使用的内容"工具已尝试过,但在我的体验中并没有真正发挥作用) 。您只需要使用您对代码的了解来识别不需要的包含并手动删除它们,我很害怕。
答案 2 :(得分:0)
我不认为这可以做到。在c ++中,包含filing_date
指令的预处理器返回一个实际编译器然后处理的文本文件。这是目前将代码导入项目的唯一方法。如果#include
需要B.h
,则必须在C.h
之前以文本形式存在。
c ++编译器无法忘记"以前在一个翻译单元中需要定义。
答案 3 :(得分:0)
如上所述使用包含警戒。
#ifndef _A_H_
#define _A_H_
#include B.h
class A {
B b;
}
#endif
此外,您可以使用指向类的指针,然后显式地构造和删除类。没有引用类成员和方法的内联代码的包含文件只需要知道它包含的东西是具有成员的类,该成员是指向该类的指针。我认为这可能是一种封装形式,但我找不到一个好的例子。
class B;
class A {
B * b;
}