如何解决字段'classname'类型错误不完整

How to solve field 'classname' has incomplete type error

本文关键字:错误 类型 classname 何解决 解决 字段      更新时间:2023-10-16

我在实现以下内容时收到此错误:

A类;B类;

A 类 {
B b_obj ;错误
来了...
}

B 类 {
...
一个a_object;
...
}

我观察到的一件事是,如果我向上移动 B 类,那么它就会被删除,但由于我使用的是双向链接,它在 B 中也有 A 类的对象,因此我无法摆脱这两个错误。

这被称为循环依赖问题。请参阅这个伟大的答案,详细了解如何解决它。

循环依赖

struct A { B b; }; 
struct B { A a; }; 

永远不会编译。A 不知道 B 的大小,反之亦然(一个在另一个之前声明)。

现在你可能会想写(用前向声明)

struct A { std::shared_ptr<B> b; }; 
struct B { std::shared_ptr<A> a; }; 

这将编译并(可能/会)引入内存泄漏(A 指 B,反之亦然)。

因此,问题是:A 拥有 B 还是 B 拥有 A——甚至另一个 C 类同时拥有两者。

(有了定义的所有权,您可能只使用 new/delete 而不是 shared_ptr)