包括嵌套类

时间:2011-02-04 10:37:50

标签: c++ nested-class

我有一个带有几个迭代器的容器类作为嵌套类。结构是这样的:

class Grid
{
protected:
    class Iterator
    {
        Iterator(Grid* g) : grid(g){}
        Grid* grid;
    }
    class MoreIterator : public Iterator
    {
    }
}

现在我想在他们自己的头文件中移动迭代器,以清理容器代码。

class Grid
{
protected:
#include "griditerators.h"
}

到目前为止,这个编译没有错误。但是:

在QtCreator中的行

Iterator(Grid* g) : grid(g){}
Grid* grid;

被标记为错误,告诉我“网格不是类型名称”。

我想我可以通过griditerator.h文件中的前向声明来解决这个问题:

class Grid;
class Iterator
{
    Iterator(Grid* g) : grid(g){}
    Grid* grid;
}

但是这给了我一个编译错误:类Grid与声明它的类具有相同的名称。

用。替换前向声明     #include“grid.h” 作品。但我不知何故认为这很难看。

所以我有两个工作选择。一个显示我的IDE中的丑陋错误,另一个我不喜欢那么多。

我尝试了其他变体,其中include不在封闭类中,但由于不同原因而无法编译。

所以我的问题是:是否有任何“最佳实践”或包含模式来处理太大而无法将它们保存在封闭类文件中的嵌套类?

例如,有没有办法声明一个嵌套类,如:

class Grid::Iterator

2 个答案:

答案 0 :(得分:7)

不要将嵌套类声明放在单独的头文件中。这是糟糕的设计,会让任何需要维护代码的人感到困惑。如果嵌套类太大,则将其删除并将其放入其自己的编译单元(h / cpp组合)中。

答案 1 :(得分:1)

在单独的文件中添加嵌套类实现很容易。我一直这样做,但你仍然需要在它的所有者中声明嵌套类。执行以下操作:

    class Grid
    {
    protected:
        class Iterator;
        class MoreIterator;
    };

然后在单独的cpp或头文件中,您将需要以下列方式实现嵌套类:

class Grid::Iterator
{
    Iterator(Grid* g) : grid(g){}
    Grid* grid;
}
class Grid::MoreIterator : public Iterator
{
}

关于这一点很酷的是,类Grid不需要知道两个嵌套类的细节,但是两个嵌套类知道类Grid的细节,并且将具有类Grid中的私有数据的访问权限任何方法都是Grid类的成员。