2012-03-23 186 views
0

我试图解决以下这个结构我已经取得了一些文件涉及到循环依赖的问题:与循环依赖问题

#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 

了Bh

#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 

#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 

迪拉姆

#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

我没有看到任何包括警卫。请显示一些真实的代码。 – 2012-03-23 10:56:56

+3

你为什么要转发声明类*和*包含头文件? – 2012-03-23 10:57:07

+0

我没有把后卫化妆较短这里,但在所有的文件,真正的代码不与任何贡献这里,只能使凌乱,方案是一样的 – 2012-03-23 11:07:01

回答

4

,如果你删除头所有的#includes,并把它们在源文件中,一切都应该编译。

你并不需要包括因为你必须向前声明这是在这种情况下,充足的,因为你只使用前声明的类常量引用。 (注意:如果您的示例代码模仿您的实际代码,则以前的陈述仅适用)。

您还可以添加一个单独的头forward.h包含的声明,而不是到处重复自己:

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

现在让AH,BH等#include forward.h,你不需要在每头向前声明了。

+0

谢谢,我是这样做的,一切都完美地编译 – 2012-03-23 12:11:25

0

此外,它始终是添加#警卫如下一个好主意:

的#ifndef _INCLUDED_A_H 的#define _INCLUDED_A_H

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

#endif

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