2011-02-03 50 views
1

我遇到了包含模型實現和* .h和* .hpp文件的循環依賴包含模型的問題。循環依賴關係,標題和模板

讓我們想象一下班以下的繼承順序:

A->B->C, 
A->A1, 
B->B1, C->C1 

其中A,A1是抽象類。

A.H(抽象類)

#ifndef A_H 
#define A_H 

template <class A> 
{ 
    //some code 
    virtual A() = 0; 
}; 

#include "A.hpp" 

#endif 

A.hpp

#ifndef A_HPP 
#define A_HPP 
#include "B.h" //Circular dependency 
#include "C.h" //Circular dependency 

void create Object(A ** a, unsigned int code) 
{ 
    switch (code) 
    { 
    case 0: *a = new B(); break; 
    case 1: *a = new C(); 

    }; 
} 

#endif 

B.h

#ifndef B_H 
#define B_H 

#include "A.h" 

template <class T> 
class B : public A <T> 
{ 
    //Some code 
}; 

C.h

#ifndef C_H 
#define C_H 

#include "C.h" 

template <class T> 
class C : public B <T> 
{ 
    //Some code 
}; 

A1.h(抽象類)

#ifndef A1_H 
#define A1_H 

#include "A.h" 

template <class T> 
class A1 : public A <T> 
{ 
    //Some code 
}; 

#include "A.hpp" 

#endif 

A1.hpp

#ifndef A1_HPP 
#define A1_HPP 
#include "B1.h" //Circular dependency 
#include "C1.h" //Circular dependency 

void create Object(A1 ** a1, unsigned int code) 
{ 
    switch (code) 
    { 
    case 0: *a = new B1(); break; 
    case 1: *a = new C1(); 

    }; 
#endif 

B1.h

#ifndef B1_H 
#define B1_H 

#include "B.h" 

template <class T> 
class B1 : public B <T> 
{ 
    //Some code 
}; 

C1.h

#ifndef C1_H 
#define C1_H 

#include "C.h" 

template <class T> 
class C1 : public C <T> 
{ 
    //Some code 
}; 

如何做出合理包括避免循環依賴?我試圖取代包括與前向聲明指令,但不幸的是它是不夠的編譯器...

A.hpp

#ifndef A_HPP 
#define A_HPP 

template <class T> 
class A; 
template <class T> 
class B; 

//some code 
#endif 

1.hpp

#ifndef A1_HPP 
#define A1_HPP 

template <class T> 
class A; 
template <class T> 
class B; 

//some code 
#endif 
+2

你應該使用前向聲明,可能的地方,而不是包括標題。我不能說你可以在哪裏替換包含前向聲明的指令,而不會看到你的代碼。 – 2011-02-03 17:33:57

+0

[Two classes and inline functions]可能的重複(http://stackoverflow.com/questions/2233149/two-classes-and-inline-functions) – 2011-02-03 17:41:42

回答

1

你需要:

  1. 定義在其標題中的每個類
  2. 讓每個接頭,包括依賴它需要
  3. 不** **需要的依賴在定義的類成功,並向前申報。

如果你完成了上述所有操作,你將允許其他代碼以任何順序包含頭文件,但是它們仍然可以在「圓化」中工作。沒有我的拼寫檢查員不知道這個詞,因爲我剛剛完成。

換句話說,你需要做這樣的事情:

了foo.h:

 
    #ifndef FOO_H 
    #define FOO_H 

    #include "bar.h" 

    class bar;  // THIS IS THE CRITICAL LINE 

    class foo { 
    // ... uses bar 
    } 
    #endif /* FOO_H */ 

bar.h

 
    #ifndef BAR_H 
    #define BAR_H 

    #include "foo.h" 

    class bar;  // THIS IS THE CRITICAL LINE 

    class bar { 
    // ... uses foo 
    } 
    #endif /* BAR_H */ 
1

A.hpp和A1 .h不應包含與B或C相關的任何內容。

1

爲什麼A的實現需要知道B & C?如果父母的實施取決於特定孩子的細節,那麼繼承似乎沒有得到正確使用。

似乎你可能只是刪除那些包括和解決問題的方式。

您能特別告訴我們爲什麼您需要包含B & CA的標頭/實現?