将具有相互依赖关系的类分隔为标题

时间:2019-04-22 07:54:59

标签: c++

我有3个类,它们之间有怪异的相互依赖关系,但是这些类中有2个在单个头文件中,所以我想将它们分开。

该代码有效,但是仅当在类B的头中声明了类C时。

我在A.hpp中拥有A类,在A.cpp中具有实现

//A.hpp
#pragma once

#include <vector>

#include "b.hpp"
#include "c.hpp" //empty at the moment

class B;
class C;
class A {
  std::vector<B> b;
  std::vector<C> c;
}

这是B.hpp,其中包含B类和C类(B的实现在B.cpp中)

///B.hpp
#pragma once

#include "a.hpp"

class A;
class B {
  A& a; //reference declared to an incomplete type, OK
}

class C {
  B b; //b can be declared of type B because it was defined in this header
}

这是问题所在: 我试图将C类分离为C.hpp,并向B进行向前声明

//C.hpp
#pragma once

#include "B.hpp"

class B;
class C {
  B b; //error: incomplete type
}

但是编译器不允许我声明B类型的b,因为它不完整。 如果我不使用前向声明而将其保留:

//C.hpp
#pragma once

#include "B.hpp"

class C {
  B b; //error: B does not name a type
}

由于不包含B.hpp,因此无法定义B,我不明白。

是否可以将类C分为自己的标头? 还是使用指针是我唯一的选择?

//C.hpp
#pragma once

#include "B.hpp"

class B;
class C {
  B* b; //pointer to class with incomplete type, OK
}

0 个答案:

没有答案