c++ - 包括嵌套类

标签 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;
}

但这给了我一个编译错误:Class Grid 与声明它的类同名。

将前向声明替换为 #include "grid.h" 作品。但不知怎的,我觉得那很丑。

所以我有两个可行的选择。一个在我的 IDE 中显示丑陋的错误,另一个我不太喜欢。

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

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

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

class Grid::Iterator

最佳答案

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

关于c++ - 包括嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4897024/

相关文章:

C++ STL 无法找到嵌套类的比较器

python - Python 中嵌套类的替代方法是什么

c++ - BinaryNode' 没有命名类型

c++ - 查看核心转储

c++ - 我可以使用 memcmp 两个比较多字节字符串吗?

c++ - 为什么我自定义的 `::swap` 函数没有被调用?

c++ - 在它所在的类之外声明一个嵌套类?

c++ - 赋值后值可以改变吗?

c# - 映射到嵌套类

java:嵌套类定义 - 名称是否冲突? (OCPJP)