2012-06-28 73 views
0

我正在開發使用Visual Studio 2010中C++程序我有這些類定義&頭文件:
SH:循環類的依賴,而包括C頭文件++

class s : oe { 
    ... 
}; 

日:

class t : oe { 
    ... 
}; 

oe.h:

class oe { 
    ... 
    o getO();//we reference to class 'o' in oe.h, so we must include o.h begore oe.h 
}; 

&哦:

class o { 
    ... 
    s getS();//we reference to class 's' in o.h, so we must include s.h begore o.h 
}; 

的問題是,我們參照「O」級在oe.h,所以我們必須包括o.hoe.h之前,&我們也參考o.h類的',所以我們必須包括s.ho.h之前,但我們不能這樣做,因爲s.h需要oe.h & oe.h需求o.h & o.h需求s.h
正如你所看到的,在類依賴週期&中存在某種循環,所以我無法編譯該項目。如果我SH &之間移除日& oe.h的依賴性,這個問題就會解決(這裏是stdafx.h這個狀態):

#include "s.h" 
#include "t.h" 
#include "o.h" 
#include "oe.h" 

,但我必須使用所有給定的依賴&我不能刪除依賴任何人。任何想法?

+0

[頭文件之間的循環依賴關係]可能的重複(http://stackoverflow.com/questions/2089056/cyclic-dependency-between-header-files) – RedX

+0

搜索forwad聲明和循環頭依賴。關於stackoverflow有很多問題。 – RedX

回答

5

您可以使用轉發聲明解決此問題,並將實現移至實現文件。

而不是包括s頭,只是向前它聲明:

class s; 

,你可以使用它作爲一個不完整的類型,除了類的數據成員任何事情。 (只要實現是分開的)。

這很可能不會解決潛在問題,這是您的設計。

+0

如果可以的話,我會爲最後一行添加+1! –

0

前向聲明不僅適用於返回值的指針/引用。

所以,你可以做這樣的事情:

oe.h:

class o; 

class oe { 
    o getO(); 
}; 

oe.cpp:

#include "oe.h" 
#include "o.h" 

o oe::getO() { 
    return o(); 
} 

沖洗,必要時重複.. 。由於.h文件中不再有#include,所以循環包含依賴關係不存在機會。

+0

並用於參數。 ;) –

+0

你還應該添加'public:'關鍵字 – Golob