2011-02-04 12 views
1

入れ子クラスとして複数の反復子を持つコンテナクラスがあります。入れ子クラスを含む

class Grid 
{ 
protected: 
    class Iterator 
    { 
     Iterator(Grid* g) : grid(g){} 
     Grid* grid; 
    } 
    class MoreIterator : public Iterator 
    { 
    } 
} 

今、私はコンテナコードをクリーンアップするために、自分自身のヘッダファイルにイテレータを移動したい:構造がilkeが、このものです。

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 

答えて

7

別のヘッダ・ファイル内の入れ子になったクラス宣言を入れないでください。それは悪いデザインで、あなたのコードを維持しなければならない他の誰かのことを混乱させます。ネストされたクラスが大きすぎる場合は、ネストされていないクラスをネストしてコンパイルしてください(h/cppコンボ)。

+0

Ok、単純な解決策:私は彼らが入れ子になっていることが気に入っていました。 1つのヘッダーファイルに基本クラス(Iterator)と3つの派生クラス(MoreIterator)を入れても構いませんか? –

+0

もちろん、私は定期的に数多くのクラスを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 
{ 
} 

この程度のクールなことは、クラスのグリッドにはないということです2つのネストされたクラスの詳細を知る必要がありますが、2つのネストされたクラスはGridクラスの詳細を認識し、Gridクラスのメンバーであるメソッドと同様に、クラスのプライベートデータへのアクセス権を持ちます。

+0

良い情報ですが、質問は "ベストプラクティス" –

関連する問題