0

特定のクラスにイテレータを実装していますが、イテレータにはAメンバーへのアクセスが必要であり、Aアクセスも必要ですiterator-- 宣言できるようにしたいですA::iterator it;

クラスを他のクラスの中に単純にネストできることはわかっています。この場合、次のようになります。

class A {
public:
    class iterator {
    };
};

しかし、クラスAiteratorそれ自体の両方に大量のコードが含まれているため、これらのクラスを 2 つの異なるファイルに分割したいと考えています。

ここでの問題は、適切なイテレータ演算子を実装するために、クラスAが自然#include iterator.hppに を含むだけでなく、iteratorも含める必要があることです。Aインクルードガードを追加しても、これを機能させることができませんでした。


ここに私が持っているもののスニペットがあります:

a.hpp :

# include iterator.hpp
# ifndef A_HPP
# define A_HPP

template <typename T>
class A {
public:
    typedef iterator<T> iterator;
};

iterator.hpp :

# include a.hpp
# ifndef ITERATOR_HPP
# define ITERATOR_HPP

template <typename T>
class iterator {
public:
    // Constructor
    iterator(A<T> *a) {
    }
};

クラスはかなり大きいので、コード全体を投稿しませんでした


Obs : この再帰的な包含を実行することができない場合でも、クラスiteratorを の名前空間にネストすることはできますが、 class のA外側で宣言することでA十分です。

4

2 に答える 2

3

前方宣言により、これらの問題のほとんどが解消されます。クラス定義内でメンバー関数を定義する必要がないことに注意してください。すべてのタイプが定義されている場合は、後でそれらを定義できます。(役に立ったら、黒板に 100 回書いてください: C++ は Java ではありません)。

class C;

class Iterator {
    // member function declarations
    // member data
};

class C {
    // member function declarations
    // member data
};

// member function definitions go here; there is
// no problem using C inside member
// functions of Iterator and vice versa
于 2013-04-04T12:26:37.967 に答える
1

おそらく、クラスをイテレータのテンプレート引数にします。その場合、イテレータはクラスへの即時アクセスを必要としません。

クラス:

#include "iterator.hpp"
template <typename T>
class A {
public:
  typedef Iterator<A, T> iterator;
};

イテレータ:

template <typename C, typename T>
class Iterator {
  Iterator (C* a);
}
于 2013-04-04T12:40:08.933 に答える