c ++中的循环依赖

时间:2011-09-10 22:28:27

标签: c++ include circular-dependency

说我有这两个类:

// a.h

#include "b.h"

// b.h

include "a.h"

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

4 个答案:

答案 0 :(得分:2)

您可以使用前向声明,如下所示:

class B;

class A
{
    B* ThisIsValid;
}

class B
{
    A SoIsThis;
}

有关详细信息,请参阅this SO问题。

对于预处理器#include,可能有更好的方法来组织代码。但是,如果没有完整的故事,很难说。

答案 1 :(得分:1)

延伸@Borealid的回答:

  

为避免循环包含问题,请使用“包含警卫”

例如

#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 

答案 2 :(得分:0)

您可以使用所谓的“前向声明”。

对于一个函数,这就像void myFunction(int);。对于变量,它可能看起来像extern int myVariable;。对于课程class MyClass;。这些脱胎语句可以包含在实际的代码承载声明之前,并为编译器提供足够的信息来生成使用声明类型的代码。

为了避免循环包含问题,使用“包含保护” - 每个头文件顶部的#ifdef会阻止它被包含两次。

答案 3 :(得分:0)

“other”类只能有一个引用或指向“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();
}