144

私は C++ を学ぼうとしているので、この質問が基本的な知識の欠如を示している場合はご容赦ください。実際、私には基本的な知識が不足しています。

私が作成したクラスのイテレータを作成する方法を理解する手助けが必要です。

ポイントのコンテナを持つ「Shape」クラスがあります。Shape を参照し、Shape の位置を定義するクラス「Piece」があります。ピースには形状がなく、形状を参照しているだけです。

ピースは、それが参照するシェイプと同じポイントのコンテナですが、ピースの位置のオフセットが追加されているように見せたいです。

Piece がコンテナそのものであるかのように、Piece の Points を繰り返し処理できるようにしたいと考えています。私は少し読んだことがありますが、私を助けてくれるものは何も見つかりませんでした。任意のポインタに非常に感謝します。

4

6 に答える 6

63

/EDIT:なるほど、ここでは独自のイテレータが実際に必要です(最初に質問を読み違えました)。それでも、同様の状況で役立つ可能性があるため、以下のコードをそのままにしておきます。


ここで実際に独自のイテレータが必要ですか? おそらく、必要なすべての定義を実際のポイントを保持するコンテナーに転送するだけで十分です。

// Your class `Piece`
class Piece {
private:
    Shape m_shape;

public:

    typedef std::vector<Point>::iterator iterator;
    typedef std::vector<Point>::const_iterator const_iterator;

    iterator begin() { return m_shape.container.begin(); }

    const_iterator begin() const { return m_shape.container.begin(); }

    iterator end() { return m_shape.container.end(); }

    const_iterator end() const { return m_shape.const_container.end(); }
}

これは、内部で を使用していることを前提としていますvectorが、型は簡単に変更できます。

于 2008-09-29T13:05:40.330 に答える
42

Boost.Iterators を使用する必要があります。これには、既存のイテレーター用の新しいイテレーターとアダプターを実装するための多数のテンプレートと概念が含まれています。私はまさにこのトピックに関する記事を書きました。2008 年 12 月の ACCU マガジンに掲載されています。Boost.Iteratorsを使用して、オブジェクトからメンバーコレクションを公開するという、まさにあなたの問題に対する(IMO)エレガントなソリューションについて説明します。

stl のみを使用する場合は、Josuttis の本に独自の STL イテレータの実装に関する章があります。

于 2008-09-29T15:34:12.457 に答える
20

こちらの Designing a STL like Custom Containerは、STL のようなコンテナー クラスをイテレーター クラスと共にどのように設計できるかについての基本概念のいくつかを説明する優れた記事です。逆イテレータ (少しタフ) ですが、演習として残します :-)

HTH、

于 2009-05-08T14:37:05.757 に答える
15

このddj記事を読むことができます

基本的に、 std::iterator から継承して、ほとんどの作業を完了させます。

于 2008-09-29T13:09:48.277 に答える
1

問題の解決策は、独自の反復子を作成することではなく、既存の STL コンテナーと反復子を使用することです。各シェイプのポイントをベクトルのようなコンテナーに格納します。

class Shape {
    private:
    vector <Point> points;

そこから何をするかは、デザイン次第です。最良の方法は、Shape 内のメソッドでポイントを反復処理することです。

for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
    /* ... */

Shape の外側のポイントにアクセスする必要がある場合 (これは設計の欠陥の兆候である可能性があります)、ポイントの反復子アクセス関数を返す Shape メソッドを作成できます (この場合、ポイント コンテナーの public typedef も作成します)。このアプローチの詳細については、Konrad Rudolph による回答を参照してください。

于 2008-09-29T13:06:05.777 に答える