循环类依赖,同时在C ++中包含头文件

时间:2012-06-28 09:55:53

标签: c++ class header include dependencies

我正在使用visual studio 2010开发一个C ++程序。我有这些类定义&头文件:
s.h:

class s : oe {
    ...
};

t.h:

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
};

&安培; o.h:

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

问题是我们引用了oe.h中的“o”类,因此我们必须在o.h之前加入oe.h,&我们也引用了o.h中的班级',因此我们必须在s.h之前加入o.h,但我们不能这样做,因为s.h需要oe.h &安培; oe.h需要o.h& o.h需要s.h
如你所见,类依赖循环中存在某种循环。所以我无法编译项目。如果我删除s.h和amp;之间的依赖关系t.h& oe.h,问题将解决(此状态为stdafx.h):

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

但我必须使用所有给定的依赖关系&我无法删除任何依赖项。任何想法?

2 个答案:

答案 0 :(得分:5)

您可以使用转发声明来解决此问题,并将实施移至实施文件。

而不是包含s的标题,只需向前声明它:

class s;

您可以将它用作除类的数据成员之外的任何其他类型的不完整类型。 (假设实现是分开的)。

这很可能不会解决潜在的问题,这是您的设计。

答案 1 :(得分:0)

前向声明不仅适用于返回值的指针/引用。

所以,你可以这样做:

<强> oe.h:

class o;

class oe {
    o getO();
};

<强> oe.cpp:

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

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

根据需要进行冲洗并重复...由于#include文件中不再有.h个,因此没有机会进行循环包含依赖项。