c++ 中派生 类 的循环依赖

Circular dependency with derived classes in c++

为了打破class之间的循环依赖,传统的做法是将声明和定义分开,并在需要的地方前向声明一个class。但是,当两个 class 继承自同一基 class 的 es 相互依赖时,前向声明是不可能的,因为编译器需要查看方法的声明来进行继承。

这是它的样子。

// Base.hpp
class Base {
    public:
    virtual ~Base() = default;
    void foo();
};
// DerivedA.hpp
#include "Base.hpp"

class DerivedB;

class DerivedA : public Base {
    public:
    void bar(DerivedB& b);
};
// DerivedB.hpp
#include "Base.hpp"

class DerivedA;

class DerivedB : public Base {
    public:
    void baz(DerivedA& a);
};

然后,当我尝试实现 DerivedA 或 DerivedB 时:

// DerivedA.cpp
#include "DerivedA.hpp"
#include "DerivedB.hpp" // ERROR: redeclaration of Base

void DerivedA::bar(DerivedB& b) {
    b.foo();
}

除了代码结构的大改动外,我找不到任何解决办法。有没有更好的方法?

保护 headers 中的定义免受多重包含,例如 :

#ifndef _BASE_HPP
#define _BASE_HPP

// Base.hpp
class Base {
  public:
  virtual ~Base() = default;
  void foo();
};

#endif

#include "DerivedA.hpp" _BASE_HPP 尚未定义时,class Base 的定义被读取但在 #include "DerivedB.hpp" _BASE_HPP 已定义,因此不会再次读取 class 定义