2012-06-28 103 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