1

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

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 中显示了丑陋的错误,另一个我就是不太喜欢。

我尝试了其他变体,其中包含不在封闭类中,但由于不同的原因未能编译。

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

例如,是否有一种方法可以声明一个嵌套类,例如:

class Grid::Iterator
4

2 回答 2

7

不要将嵌套类声明放在单独的头文件中。这是一个糟糕的设计,并且会让其他必须维护您的代码的人感到困惑。如果嵌套类太大,将其取消嵌套并将其放入它自己的编译单元(h/cpp 组合)中。

于 2011-02-04T10:42:31.333 回答
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 类的成员。

于 2015-09-22T23:46:34.370 回答