【问题标题】:How to solve field 'classname' has incomplete type error如何解决字段“类名”的类型不完整错误
【发布时间】:2023-04-10 08:43:02
【问题描述】:

我在执行以下操作时遇到此错误:

A 级; B类;

A级{
B b_obj ; //这里出现错误
...
}

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

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

【问题讨论】:

  • 您希望A 包含B 和B 包含A?这不可能。至少有一个必须是引用或指针。
  • 恐怕你必须重新考虑你的设计;没有办法绕过这种循环依赖。也许其中一个类可以保存指向另一个类的指针?
  • 那么为什么问题解决了 A a_object (没有错误)
  • 您可能希望更清楚地了解您要解决的问题,而不是您的代码中的问题,Mike 已经非常准确地描述了这个问题。如果A 包含一个B,而B 包含一个reference 或pointer 指向它“拥有”A,(或副-反之亦然),您可能希望清楚地说明这一点。这很可能是 XY 问题。

标签: c++ class field


【解决方案1】:

这称为循环依赖问题。请参阅这个伟大的answer 了解如何解决它。

【讨论】:

  • 不,我尝试保存在不同的文件中,但这进一步导致我必须将 A.h 添加到 C.cpp 和 B.cpp 的情况(错误:嵌套包含),进一步将 B.h 添加到 A.cpp 和C.cpp 等等。那没用。
  • @notsogeek,你读过那个答案吗?同样,有一个真正可行的解决方案。请仔细阅读。
【解决方案2】:

循环依赖

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)

【讨论】:

  • 请使用 std::weak_ptr 进行循环引用。或者更好 - 一起避免。
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 2012-09-10
  • 2011-04-29
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多