0

我正在使用 Visual Studio 2010 开发一个 C++ 程序。我有这些类定义和头文件:
sh:

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.hbefore oe.h,并且我们引用了类's' o.h,所以我们必须包含s.hbefore o.h,但我们不能这样做,因为s.h需要oe.h&oe.h需要o.h&o.h需要s.h
如您所见,类依赖循环中存在某种循环,因此我无法编译该项目。如果我删除 sh & th & oe.h 之间的依赖关系,问题就会解决(这里是stdafx.h针对这种状态的):

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

但我必须使用所有给定的依赖项并且我不能删除任何依赖项。任何的想法?

4

2 回答 2

6

您可以改用前向声明并将实现移动到实现文件来解决此问题。

而不是包含一个标头s,只需转发声明它:

class s;

除了类的数据成员之外,您几乎可以将它用作不完整类型。(假设实现是分开的)。

这很可能无法解决根本问题,即您的设计。

于 2012-06-28T09:57:52.320 回答
0

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

因此,您可以执行以下操作:

oe.h:

class o;

class oe {
    o getO();
};

oe.cpp:

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

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

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

于 2012-06-28T10:04:48.090 回答