首页 > 解决方案 > 在 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;
};

标签: c++declarationforward-declarationcyclic-reference

解决方案


我希望我明白了你的难点。

要解释这一点,最好从编译器的角度来考察。

编译器为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

据我所知,一个定义规则有额外的限制,也许其他人可能会解释这一点。

目前不可能有“更优雅”的方式。


推荐阅读