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

时间:2019-04-03 11:18:46

标签: c++ circular-dependency

要打破类之间的循环依赖关系,传统方法是分离声明和定义,并在需要时向前声明类。但是,当从同一个基类继承的两个类相互依赖时,正向声明是不可能的,因为编译器需要查看进行继承的方法的声明。

这是它的样子。

// 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();
}

除了代码结构有很大变化外,我找不到其他方法。有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

保护标头中的定义以防止包含多个内容,例如:

#ifndef _BASE_HPP
#define _BASE_HPP

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

#endif

当尚未定义#include "DerivedA.hpp" _BASE_HPP时,将读取类 Base 的定义,但在#include "DerivedB.hpp"中将_BASE_HPP定义为类定义不再被读取