另一个文件 C++ 中的前向声明
forward declaration in another file c++
在另一个头文件中转发声明是否合法?例如:
#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
。现在,包括b
:ClassA
现在需要 2 个字节。现在包括a
:ClassB
现在需要 3 个字节。现在我们必须将ClassA
的大小更新为4字节,因为 ClassB
的大小增加 .按照这个逻辑ClassB
现在是 5 个字节、ClassA
6 个字节ClassB
7 个字节......
为了解决这个问题,您可能希望将(至少)a
和b
之一的类型更改为指向相应类的指针或引用。执行此操作(在 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
的大小。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 用"=default"声明的函数应该只在头文件中执行
- 调用在 HXX 文件中声明的静态数据成员
- 如何在 c++ 的不同文件中声明类?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 为什么要将函数声明和定义放在单独的文件中
- 枚举前向声明与头文件
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在带有类型保护的模板文件中使用前向声明
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- 文件存在时的最新检查声明生成输入"is missing"
- 在实现文件中使用模板参数声明方法
- 包含文件中的 Typdef "未在此范围内声明"
- 带有正向声明的Co-Dependent.h文件
- 无法声明文件指针数组