1

在我的 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,

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

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

4

2 回答 2

5

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

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

有关血腥细节,请参阅此答案

于 2015-02-09T17:03:33.070 回答
0

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

于 2015-02-09T17:09:34.213 回答