避免循环依赖 - 需要相互遏制

时间:2015-02-09 16:57:28

标签: c++ containment mutual-recursion

在我的GUI系统中,主要构建块为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,

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

有一种很好的方法如何使用智能指针解决问题(可能通过重新设计整个问题解决方案),还是我必须在这里使用原始指针?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

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