簡體   English   中英

包括嵌套類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM