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

标签 c++ containment mutual-recursion

在我的 GUI 系统中,主要构建 block 是 Container 类,它可以绘制(= 是可绘制的)。然而,Container 本身是一种“一种表格”——它包含单元格。

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

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

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

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,

容器.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;
// ...
}

细胞.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 适用于前向声明的类型,但它需要知道调用删除器的完整类型。

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

引用this answer血淋淋的细节。

关于c++ - 避免循环依赖——需要相互牵制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415087/

相关文章:

C++ 相互递归变体类型

c++ - 为什么允许这些默认参数?

c++ - 使用策略模式设计软件的问题

python - python 列表是否具有用于测试身份的 __contains__ 的等价物?

recursion - 相互递归函数的定点组合器?

c++ - 在 C++11 正则表达式中插入变量

c++ - 在 C++ 中迭代集合

jquery dom 可调整大小的可拖动遏制问题

haskell - Eq typeclass函数: x == y = not (x/= y) x/= y = not (x == y) work?怎么实现