2009-08-15 113 views
13

在一個項目中,我有2類:圓C++頭包括

// mainw.h

#include "IFr.h" 
... 
class mainw 
{ 
public: 
static IFr ifr; 
static CSize=100; 
... 
}; 

// IFr.h

#include "mainw.h" 
... 
class IFr 
{ 
public float[mainw::CSize]; 
}; 

但我不能編譯這段代碼,在static IFr ifr;行發生錯誤。這種交叉包含是否被禁止?

+1

我認爲應該是mainw :: CSize – 2009-08-15 11:03:05

回答

15

這是一種跨 - 包括禁止?

是的。

一個變通會說mainw的IFR成員是引用或指針,使正向聲明會做包括完整的聲明,等代替:

//#include "IFr.h" //not this 
class IFr; //this instead 
... 
class mainw 
{ 
public: 
static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp! 
static CSize=100; 
... 
} 

或者,在一個單獨的頭文件中定義CSize值(這樣Ifr.h可以包含這個其他頭文件而不是包含mainw.h)。

0

如果你有

#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
//... Code.. 
#endif 

裹住你的代碼,那麼你應該罰款:)

[編輯]代碼拼寫:o:P

+0

這在這種情況下無濟於事。 – ChrisW 2009-08-15 11:13:51

+0

在這種情況下,這確實無濟於事 - 很顯然,mainw類顯然需要在編譯前看到Ifr類的完整聲明 – 2009-08-15 11:21:26

+0

你是對的。猜測我的觸發器速度太快了:) – cwap 2009-08-15 11:28:54

4

你不能有兩個這樣嵌入對方的類。你可以讓他們中的一個指針:

class foo; 

class bar 
{ 
    foo* fooPtr; 
} 

你必須構建foo和酒吧中的構造在析構函數將其分配到fooPtr和自由 - 這肯定是有點更多的工作。

或者,在這種情況下,作爲評論者的建議之一,使mainw :: size定義並將其放在通用的地方。

1

你可以像這樣做遞歸包含,但是一般情況下你還需要使用某種類型的頭部防護技巧 - 否則預處理器將進入無限遞歸。這不會真正幫助您解決潛在的問題,因爲你本質上有兩個班,每個相互需要看到,爲了其他的完整的聲明編譯:

class mainw 
{ 
public: 
static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size 
... 

class IFr 
{ 
public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is 

無論你把哪一個首先,它將無法編譯,因爲它需要知道另一個的全部細節。

+0

由於每個班級都需要其他班級的全部詳細信息,因此[前向申明](http://stackoverflow.com/q/553682/1497596)無濟於事。但是,如果包含說A類的包含文件只包含指向B類的指針或引用,那麼對類「A」中類「B」的前向聲明可以進行編譯。 – DavidRR 2013-06-21 00:03:09

1

那種圓形夾雜的不是由C++允許的,但這應該工作:

而是包括IFr.h的,使用前向聲明。

class IFr; 
class mainw 
{ 
    //... 
}; 

這將使mainw編譯就好了,但使用ifr成員的所有代碼需要包含IFr.h了。

這隻適用於因爲ifrstatic成員。否則,編譯器需要知道ifr的確切大小。另外,正如很多其他人所說的,您應該在兩個標題周圍都包含警衛,以避免包含相同標題兩次的錯誤。

#ifndef IFR_H 
#define IFR_H 
//... 
#endif 
1

你可以這樣做:

// mainw.h 

#include "IFr.h" 
class mainw { 
public: 
    static const size_t CSize=100; 
    static IFr<CSize> ifr; 
... 
}; 

// IFr.h 
template <size_t Sz> 
struct IFr { 
    float sz_[Sz]; 
}; 

情況下或者在需要的CSize在運行時更改使用指針解決方案@ChrisW答案節目。