在C++中提前定义类

Ahead definition of class in C++

本文关键字:定义 C++      更新时间:2023-10-16

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

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

这大致就是我想要的代码的样子。。。

主干网.h:

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

设备.h:

#include "backbone.h"
class Device {
}

但这显然会在主干网中抛出一个错误。h表示设备尚未定义。我试着简单地将设备标头包含在主干标头文件中的typedef前面,但这并不奏效,因为每个标头都依赖于另一个标头。在我读过的某个地方,Objectve-C中有一些类似于"超前类定义"的东西(已经有很长一段时间没有在Obj-C中编码了),那么C++中有类似的东西吗?或者我的问题还有更好的解决方案吗?

欢迎任何帮助,并提前表示感谢。

使用正向声明。

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

您只需要添加Device的前向声明。要做到这一点,请将您的"主干.h"文件修改为以下文件:

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

这就是它的全部。

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

class Device;

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

在主干网.h中添加

class Device;

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

Device *ptrDeviceThatOwnsPort;

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

class Device;

在前面,您将让编译器知道它,它将能够生成该指针。