2015-02-09 70 views
1

在我的GUI系统中,主要构建块为Container类,其中可以绘制为(=可绘制)。但是,Container本身是'种表' - 它包含单元格。避免循环依赖 - 需要互相遏制

Cell班级服务于布局。容器所具有的单元格的数量由行数和列数定义。 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; 
// ... 
} 

是否有正冰的方式如何解决使用智能指针的情况(也许通过重新设计整个问题的解决方案),还是我必须在这里使用原始指针?

+2

我真的不明白你为什么会拥有这种循环。包含包含容器的单元格的Container的* sense *是什么?即使你在*语法*级别完成它,它似乎是糟糕的设计*语义* ... – DevSolar 2015-02-09 17:01:58

+0

你有没有考虑过使用引用而不是指针? – 2015-02-09 17:04:46

+0

我想你应该有一个容器,包含容器:D每个容器都有一个getCells()方法 – Aitch 2015-02-09 17:05:02

回答

5

std::unique_ptr适用于正向声明类型,但它需要知道调用清除程序的完整类型。

这会咬你,如果你的类使用编译器生成的析构函数。您可以通过在源文件中定义一个可能为空的自定义析构函数来排除该问题,该源文件中可以看到unique_ptr所保存类型的完整类型定义。

请参阅this answer了解血淋淋的细节。

+0

我已经在实现文件中定义了析构函数(甚至复制构造函数和赋值运算符)。但问题仍然存在。任何想法为什么? – sjaustirni 2015-02-09 17:45:04

+0

@Dundee没有更多的细节。你能发布你从编译器得到的完整的错误信息,包括模板实例化堆栈的所有步骤吗? – ComicSansMS 2015-02-09 17:48:12

+0

问题是一个命名空间问题。我忘了将正向声明放在适当的命名空间中。感谢您的帮助。为我的白痴道歉。 – sjaustirni 2015-02-09 18:30:35

0

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

+1

但将它们另存为智能指针(共享或唯一)。我不想一直都想被复制? – Aitch 2015-02-09 17:12:58