C++ 类之间的复杂循环依赖

C++ 类之间的复杂循环依赖,c++,c++11,C++,C++11,我有5个类(A、B、C、D、E),每个类都有自己的类和头文件 class A{}; class B { B(A&a); }; class C { C(B&b); }; class D:public A {}; class E:public D { vector<C*> vc; }; A类{}; B类 { B(A&A); }; C类 { C(食宿);; }; D类:公共A {}; E类:公共D类 { 向量vc; }; 转发声明将不起作用,因为我在这些类

我有5个类(A、B、C、D、E),每个类都有自己的类和头文件

class A{};
class B
{
  B(A&a);
};
class C
{
  C(B&b);
};
class D:public A
{};
class E:public D
{
   vector<C*> vc;
};
A类{};
B类
{
B(A&A);
};
C类
{
C(食宿);;
};
D类:公共A
{};
E类:公共D类
{
向量vc;
};

转发声明将不起作用,因为我在这些类中的每个类中都使用了很多共享指针。

您也可以对共享指针使用转发声明,您只需要转发声明析构函数对象

标题:

struct A;
shared_ptr<A> create_A();
结构A;
共享_ptr创建_A();
Impl:

结构A{…}; 结构A_销毁程序{void operator()(A*p){delete p;}; shared_ptr create_A(){返回shared_ptr(new A(),A_destructor());}
每个类都可以声明一个析构函数,并在源中定义该析构函数,包括由唯一/共享指针析构函数的相应类型的头。而在页眉中使用这种类型的简单转发就可以了

#include <memory>

// header B
struct A;
struct B {
    ~B();
    std::shared_ptr<A> a;
};

// header A
struct A {};

// source B
#include "a"
#include "b"
B::~B() {}
#包括
//标题B
结构A;
结构B{
~B();
std::共享的ptr a;
};
//标题A
结构A{};
//来源B
#包括“a”
#包括“b”
B::~B(){}

您不需要它-每个类都可以声明一个析构函数,并在包含析构函数类型标头的源中定义该析构函数。(还有,你的破坏者看起来像是内存泄漏)tohava给了我正确的答案,谢谢你tohava
std::shared_ptr
类成员可以与不完整的类型一起使用。调用
make_shared
时(或从原始指针手动创建
shared_ptr
时),类型需要完整,因此在包含所有相关头之后,应该在实现文件中完成,而不是在类中内联。您的问题是什么?
#include <memory>

// header B
struct A;
struct B {
    ~B();
    std::shared_ptr<A> a;
};

// header A
struct A {};

// source B
#include "a"
#include "b"
B::~B() {}