2012-03-23 254 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指出的那樣,當你有前向聲明時,你也不需要包含完整的定義。