[英]Unable to access members of including class from a polymorphic nested classes
[英]including nested classes
我有一個帶有多個迭代器作為嵌套類的容器類。 結構有點像這樣:
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;
}
但這給了我一個編譯錯誤:類網格與聲明它的類具有相同的名稱。
用#include“ grid.h”替換前向聲明可以正常工作。 但是我以某種方式認為這很丑陋。
所以我有兩個工作選擇。 一個顯示我的IDE中的丑陋錯誤,另一個我只是不太喜歡它。
我嘗試了其他變體,其中include不在封閉的類之內,但是由於不同的原因而無法編譯。
所以我的問題是:是否有任何“最佳實踐”或包含處理嵌套類的模式,這些模式太大而無法將其保留在其封閉的類文件中?
例如,有一種方法可以聲明一個嵌套類,例如:
class Grid::Iterator
不要將嵌套的類聲明放在單獨的頭文件中。 這是一個糟糕的設計,會使必須維護您代碼的其他人感到困惑。 如果嵌套類太大,則將其嵌套並放入其自己的編譯單元(h / cpp組合)中。
在單獨的文件中添加嵌套類實現很容易。 我一直都這樣做,但是您仍然需要在其所有者中聲明嵌套類。 請執行下列操作:
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類的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.