循环依赖的问题

时间:2012-03-23 10:55:01

标签: c++ visual-c++ module

我试图解决与我在该结构之后制作的一些文件中的循环依赖相关的问题:

A.H

#include "B.h"
#include "C.h"
#include "D.h"

namespace NS {

class B;
class C;
class D;

class A {

/* ... */

    A(const A& a) {};

    A(const B& a) {};
    A(const C& a) {};
    A(const D& a) {};

/* ... */
};

}; // NS END

B.h

#include "A.h"
#include "C.h"
#include "D.h"

namespace NS {

class A;
class C;
class D;

class B {

/* ... */

    B(const B& a) {};

    B(const A& a) {};
    B(const C& a) {};
    B(const D& a) {};

/* ... */
};

}; // NS END

C.h

#include "A.h"
#include "B.h"
#include "D.h"

namespace NS {

class A;
class B;
class D;

class C {

/* ... */

    C(const C& a) {};

    C(const A& a) {};
    C(const B& a) {};
    C(const D& a) {};

/* ... */
};

}; // NS END

D.h

#include "A.h"
#include "B.h"
#include "C.h"

namespace NS {

class A;
class B;
class C;

class D {

/* ... */

    D(const D& a) {};

    D(const A& a) {};
    D(const B& a) {};
    D(const C& a) {};

/* ... */
};

}; // NS END

无论我尝试什么,我都会从构造函数中将一些错误视为其他文件中的参数类,甚至将声明放在前面,似乎它将声明作为声明和定义,并忽略另一个文件中的实际定义。我怎么能解决这个问题?

注意:我已经在每个文件中定义了防护,只是我没有把它放在这里

3 个答案:

答案 0 :(得分:4)

如果你删除标题中的所有#includes并将它们放在源文件中,那么一切都应该编译。

您不需要包含,因为在这种情况下您有前向声明就足够了,因为您只使用对前向声明的类的const引用。 (注意:以前的陈述仅在您的示例代码模仿您的实际代码时才有效。)

您还可以添加包含声明的单独标题forward.h,而不是在任何地方重复:

namesapce NS
{
  class A;
  class B;
  class C;
  class D;
}

现在制作A.h,B.h等#include forward.h,你不再需要每个标题中的前向声明。

答案 1 :(得分:0)

前瞻声明! 如果您没有使用类方法,则前向声明可以帮助您解开依赖关系。

http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml

答案 2 :(得分:0)

此外,添加#include警卫总是一个好主意,如下所示:

#ifndef _INCLUDED_A_H  #define _INCLUDED_A_H

....<这是您的头文件的正常内容> ....

#ENDIF

但主要的是,正如stijn指出的那样,当你有前瞻性声明时,你也不需要包括完整的定义。