2009-08-15 87 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答案节目。