C++ c+中的循环依赖关系+;

C++ c+中的循环依赖关系+;,c++,include,circular-dependency,C++,Include,Circular Dependency,假设我有两门课: // a.h #include "b.h" 以及: 我知道这里有一个问题,但我如何解决它,并在b类中使用a对象及其方法,反之亦然?您可以使用所谓的“转发声明” 对于函数,这类似于voidmyfunction(int)。对于一个变量,它可能看起来像extern int myVariable。对于类,classmyclass。这些无体语句可以包含在实际的带有代码的声明之前,并为编译器提供足够的信息,以便使用声明的类型生成代码 为避免循环包含出现问题,请在每个头文件的顶部使用“包

假设我有两门课:

// a.h

#include "b.h"
以及:


我知道这里有一个问题,但我如何解决它,并在
b
类中使用
a
对象及其方法,反之亦然?

您可以使用所谓的“转发声明”

对于函数,这类似于
voidmyfunction(int)。对于一个变量,它可能看起来像
extern int myVariable。对于类,
classmyclass。这些无体语句可以包含在实际的带有代码的声明之前,并为编译器提供足够的信息,以便使用声明的类型生成代码


为避免循环包含出现问题,请在每个头文件的顶部使用“包含保护”-一个
#ifdef
,以防止它被包含两次。

您可以使用转发声明,如下所示:

class B;

class A
{
    B* ThisIsValid;
}

class B
{
    A SoIsThis;
}
有关更多信息,请参见SO问题

至于预处理器————————————————inc。但是,如果没有完整的故事,很难说。

其他类只能有一个指向“first”类的引用或指针

在文件a.h中:

#include "b.h"

struct a {
    b m_b;
};
在文件b.h中:

struct a;

struct b {
    a* m_a;
};

void using_the_a_instance(b& theb);
在文件b.cpp中:

#include "b.h"
#include "a.h"

void using_the_a_instance(b& theb)
{
    theb.m_a = new a();
}

要扩展@Borealid的答案:

为避免循环包含出现问题,请使用“包含保护”

例如


StackOverflow的幽灵说,“uhhhhnnn…neeeed mooore coooode…”我在那里没有看到任何类,所以我投了反对票。这个答案没有讨论事情的真正核心,那就是你限制在
A
的头中提及
B
,以转发可声明的东西,但是在
A
的源文件中,您可以自由地
#包含
完整定义,因为没有任何内容将
#包含
源文件。。。它不会有任何循环依赖关系。这只会影响头文件,这就是我们如何利用一种有效地削弱类型使用的方法。我见过最简单的模型在头文件中正向声明它。
#include "b.h"
#include "a.h"

void using_the_a_instance(b& theb)
{
    theb.m_a = new a();
}
#ifndef MYFILE_H /* If this is not defined yet, it must be the first time
 we include this file */
#define MYFILE_H // Mark this file as already included
// This only works if the symbol we are defining is unique.

// code goes here

#endif