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

しかし、それは私にコンパイルエラーを与えます:クラスグリッドはそれが宣言されているクラスと同じ名前を持っています。

前方宣言を#include"grid.h"に置き換えると機能します。しかし、私はどういうわけかそれは醜いと思います。

したがって、2つの作業オプションがあります。1つは私のIDEで醜いエラーを示し、もう1つはあまり好きではありません。

インクルードが囲んでいるクラス内にない他のバリエーションを試しましたが、さまざまな理由でコンパイルできませんでした。

だから私の質問は:「ベストプラクティス」や、それを囲むクラスファイル内に保持するには大きすぎるネストされたクラスを処理するためのパターンを含めることはありますか?

たとえば、次のようなネストされたクラスを宣言する方法があります。

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 が 2 つのネストされたクラスの詳細を知る必要がないことですが、ネストされた 2 つのクラスはクラス Grid の詳細を認識しており、クラス Grid のプライベート データへのアクセス権を持つことになります。クラス Grid のメンバーです。

于 2015-09-22T23:46:34.370 に答える