我有一个带有几个迭代器的容器类作为嵌套类。结构是这样的:
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
答案 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类的成员。