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 定义
为了打破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 定义