c++ - 在 C++ 中更优雅地打破循环引用
问题描述
当我的头文件相互包含时,我最近得到了许多循环依赖。另请参见此处:什么是 C++ 中的前向声明?
我实际上并不完全明白为什么它是一个循环。当编译器查看包含的头文件时,为什么它不能识别类声明?
是否有更优雅/其他方式来打破这些循环,而不是其他类的前向声明?我不喜欢在我当前的班级前面有其他班级声明。例如
#include "Wheel.h" // Include Wheel's definition so it can be used in Car.
#include <vector>
class Wheel;
class Car
{
std::vector<Wheel> wheels;
};
解决方案
我希望我明白了你的难点。
要解释这一点,最好从编译器的角度来考察。
编译器为Car.h
:
- 替换
#include "Wheel.h"
为它的内容。 - 替换
#include <vector>
为它的内容。
在这一步,翻译单元Car.h
看起来像这样。
class Car;
class Wheel
{
Car* car;
};
// Vector implementation of the stl goes here
class Car
{
std::vector<Wheel> wheels;
};
在这一点上Car* car;
,class Car
需要声明(声明对于指针类型就足够了)来定义class Wheel
这就是为什么你需要前向声明,因为你应该告诉编译器有 aclass Car
并且它将很快被定义。
如果您在第 1 行注释掉,class Car
编译器将无法知道是否会有 a class Car
。
据我所知,一个定义规则有额外的限制,也许其他人可能会解释这一点。
目前不可能有“更优雅”的方式。
推荐阅读
- twilio - Twilio Voice - 允许当前呼叫者收听前一个呼叫者录制的语音邮件
- java - Fetch number from and String List from firestore
- android - Three states continuous animation (MotionLayout)
- ios - How to keep updating a constant value in Swift
- razor-pages - ASP.NET Core 3.1 Razor 页面:如何从索引页面自动重定向到登录页面?
- azure - 如何在 ADF V2 的复制活动中替换 foreach 循环内的数组值
- c# - C# WPF 全局样式在代码的某些部分不起作用
- api - CORS - Api 网关、lambda 和 vue.js
- python - 如何获得乌龟应该移动的角度?
- python - Sublime Text 3 Python3 构建不起作用?