0

可能重复:
带有前向声明错误的循环依赖

我有两个文件,一个定义结构(这里:端口),另一个定义一个类(这里:设备)。由于类使用这些结构作为端口,因此它们需要链接到类,最好是通过指针。但是如果设备类还没有定义,我该如何创建这个指针呢?

这大致是我希望代码看起来像......

骨干.h:

typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;

设备.h:

#include "backbone.h"

class Device {
}

...但这显然会在backbone.h中抛出一个错误,说Device has not been defined。我尝试简单地将设备头包含在主干头文件中,在 typedef 前面,但这不起作用,因为每个头都依赖于另一个头。我在某处读过,在 Objectve-C 中有一些类似于“超前类定义”的东西(已经有一段时间没有在 Obj-C 中编码了),那么在 C++ 中是否有类似的东西?或者对我的问题有更好的解决方案吗?

非常欢迎任何帮助,并提前致谢。

4

5 回答 5

6

使用前向声明。

class Device;

typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;
于 2012-10-12T09:53:32.027 回答
2

您只需要添加 Device 的前向声明。为此,请将您的“backbone.h”文件修改为以下内容:

class Device;
typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;

这里的所有都是它的。

于 2012-10-12T09:53:45.987 回答
2

由于您的结构只有一个指向您的指针,因此Device您可以通过前向声明类来了解。只需添加

 class Device;

在你的aPort头文件中声明之前。如果您不使用指针,则需要包含头文件Device

于 2012-10-12T09:53:59.547 回答
1

在骨干网.h。添加

class Device;
于 2012-10-12T09:53:43.590 回答
1

问题显然是因为当编译器到达该行时

Device *ptrDeviceThatOwnsPort;

它不知道是什么Device。但是,此时您不需要包含Device' 标头。由于您正在创建一个指针,因此编译器知道这Device是一个类名就足够了。通过添加一个看起来像的前向声明

class Device;

在前面,你会让编译器知道它,它就能生成那个指针。

于 2012-10-12T09:54:28.127 回答