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