避免循环依赖——需要相互牵制

Avoid cyclic dependencies - need for mutual containment

在我的 GUI 系统中,主要构建块是 Container class,可以绘制(= 是可绘制的)。但是,Container 本身是一种“ 类型的 table” - 它包含单元格。

Cell class 用于布局。容器的单元格数由行数和列数定义。Cell 对象不可见。

这就是问题所在。 Cell 个对象无法绘制 - 它们包含 Container 个对象,这些对象是在调用 cell.draw() 时根据 Cell 对象中定义的规则(对齐、填充等)绘制的.

我知道这可以通过使用原始指针轻松解决,以避免在此处创建循环依赖,但我想尽可能使用智能指针。但是,根据我得到的错误,很明显智能指针 必须知道 对象的大小,这与原始指针不同。

Unique_ptr错误

/usr/include/c++/4.8/bits/unique_ptr.h:65:22: error: invalid application of ‘sizeof’ to incomplete type ‘Container’
  static_assert(sizeof(_Tp)>0,

Container.hpp

#include <Cell.hpp> // Causes circular dependency
class Cell; // Causes error: invalid application of ‘sizeof’

class Container
{
// ...
private:
    std::vector<std::unique_ptr<Cell>> cells;
// ...
}

Cell.hpp

#include <Container.hpp> //Causes circular dependency
class Container; // Causes error: invalid application of ‘sizeof’
class Cell
{
// ...
private:
    std::vector<std::unique_prt<Container>> subcontainers;
// ...
}

有没有使用智能指针解决这种情况的好方法(也许通过重新设计整个问题解决方案),或者我必须在这里使用原始指针?

std::unique_ptr 适用于前向声明的类型,但它需要知道调用删除器的完整类型。

如果您的 class 使用编译器生成的析构函数,这会伤害您。您可以通过在源文件中为 class 定义一个(可能为空的)自定义析构函数来解决这个问题,其中 unique_ptr 持有的类型的完整类型定义是可见的.

有关详细信息,请参阅 this answer

答案: 我认为你应该有一个容器,包含容器 :D 每个容器都有一个 getCells() 方法。