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