要打破类之间的循环依赖关系,传统方法是分离声明和定义,并在需要时向前声明类。但是,当从同一个基类继承的两个类相互依赖时,正向声明是不可能的,因为编译器需要查看进行继承的方法的声明。
这是它的样子。
// 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();
}
除了代码结构有很大变化外,我找不到其他方法。有更好的方法吗?
答案 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
定义为类定义不再被读取