另一个文件 C++ 中的前向声明

forward declaration in another file c++

本文关键字:声明 文件 C++ 另一个      更新时间:2023-10-16

在另一个头文件中转发声明是否合法?例如:

#ifndef _MAIN_H_
#define _MAIN_H_
class ClassA;
class ClassB;
#include "classa.h"
#include "classb.h"
#endif
#ifndef _CLASSA_H_
#define _CLASSA_H_
#include "main.h"
class ClassA
{
public:
    ClassB b;
};
#endif
#ifndef _CLASSB_H_
#define _CLASSB_H_
#include "main.h"
class ClassB
{
public:
    ClassA a;
};
#endif

类 A 和类 B 相互依赖,并且都具有另一种类型的对象。我所做的是在另一个文件中转发声明这两个类。有没有一种干净的方法来做到这一点?

通常,跨标头转发声明类是合法的。

但是,在您的示例中,您正在相互实例化两个类,这绝对是非法的!

为了说明这背后的原因,请考虑以下几点:

ClassA取 1 个字节而不带b ClassB也取 1 个字节而不取a 。现在,包括bClassA现在需要 2 个字节。现在包括aClassB现在需要 3 个字节。现在我们必须将ClassA的大小更新为4字节,因为 ClassB 的大小增加 .按照这个逻辑ClassB现在是 5 个字节、ClassA 6 个字节ClassB 7 个字节......

为了解决这个问题,您可能希望将(至少)ab之一的类型更改为指向相应类的指针或引用。执行此操作(在 c/c++ 中)时,请确保您了解内存管理!

然后,原始问题的解决方案可能如下所示:

A.h 级

#pragma once
class ClassB;
class ClassA
{
public:
    ClassB* b;
}

班B.h

#pragma once
#include "ClassA.h"
class ClassB
{
public:
    ClassA a;
}

请注意,ClassB.h 需要 ClassA.h,因为出于演示目的:ClassB 包含一个类型为 ClassA 的完整对象,因此需要定义 ClassA

是的。但是你应该使用 ClassA* a;ClassA& a; 而不是 ClassA a;(在 cpp 文件中进行相应的初始化)因为没有关于ClassA大小的信息来计算ClassB的大小。