如何避免标题耦合

num*_*l25 1 c c++ visual-studio-2008 visual-studio visual-c++

我正在努力解决这个问题,因为我似乎无法在网上找到一个好的资源.

我不完全理解这个问题,因为我从未解决过这个问题所以我会尽量把它描述得最好.

前一段时间我遇到了一个问题,即标题被忽略了,因为"它们已被调用一次,因此当它们被另一个文档再次调用时,它被忽略,因此抛出了错误"

我从来没有完全理解,因为你可以多次调用一个标题而不会抛出错误

那么header1.h

#ifndef _FCLASS_
#define _FCLASS_
class firstClass {
     ...//declaration
}

#endif
Run Code Online (Sandbox Code Playgroud)

header2.h

#ifndef _SCLASS_
#define _SCLASS_

#include "header1.h"

class SecondClass:firstClass{
     ...//declaration
}

#endif
Run Code Online (Sandbox Code Playgroud)

header3.h

#ifndef _TCLASS_
#define _TCLASS_

#include "header1.h"
class thirdClass:firstClass{
     ...//declaration
}
#endif
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,header1类被调用了两次,并且不应该抛出任何错误.即使header1被声明一次,它也可以被多个头使用.

所以我的问题是,在什么情况下,如果文件已经被声明一次,文件实际上可以忽略它.

此类问题仅适用于包含标头的.cpp文件吗?

Mar*_*k B 5

这种情况最常发生在有标题周期时(两个标题包括彼此最可能的情况).

仅仅是为了说明,真实的例子通常更复杂.

啊:

#ifndef A_INCLUDED
#define A_INCLUDED

#include "B.h"

class A
{
};

class C
{
    B b;
}
#endif
Run Code Online (Sandbox Code Playgroud)

BH:

#ifndef B_INCLUDED
#define B_INCLUDED

#include "A.h"

class B : public A
{
};
#endif
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无论您包含哪个头,都有一个循环依赖,阻止它编译.如果你包括Ah,它包括BhBh然后包括Ah但是包含防护阻止它再次被包括.所以它继续编译Bh并在它不知道时失败class A.如果首先包括Bh,则相反的情况适用.

编辑:我应该提到这通常是通过将一个或两个标头中的逻辑重构为另一个标头,和/或使用前向声明而不是实际包含来解决的.