在C ++中提前定义类

时间:2012-10-12 09:51:28

标签: c++ class pointers

  

可能重复:
  Circular Dependency with forward declaration error

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

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

backbone.h:

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

device.h中:

#include "backbone.h"

class Device {
}

...但是这显然会在backbone.h中引发错误,说 Device尚未定义。我尝试简单地将设备头部包含在主干头文件中,在typedef前面,但是这不起作用,因为每个头部都依赖于另一个头部。在某个地方我已经读过,在Objectve-C中有一些东西沿着“前面的类定义”左右(没有在Obj-C中编码很长一段时间),所以在C ++中有类似的东西吗?或者我的问题有更好的解决方案吗?

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

5 个答案:

答案 0 :(得分:6)

使用前向声明。

class Device;

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

答案 1 :(得分:2)

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

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

这就是它的全部内容。

答案 2 :(得分:2)

由于你的struct只有一个指向Device的指针,你可以通过向前声明该类来了解它。只需添加

 class Device;

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

的头文件

答案 3 :(得分:1)

在backbone.h中。添加

class Device;

答案 4 :(得分:1)

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

Device *ptrDeviceThatOwnsPort;

它不知道Device是什么。但是,此时您不需要包含Device的标头。由于您正在创建指针,因此编译器知道Device是类名是足够的。通过添加类似

的前向声明
class Device;
在前面,您将让编译器知道它,并且它将能够生成该指针。