2

2つのクラスがあります。

template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix

template<typename T, typename Size>
class Iterator

Matrixは、開始イテレーターと終了イテレーターを返すことができる必要があり、イテレーターは、そのインターフェースを介して要素にアクセスするために、マトリックスへの参照を保持します。結合を防ぐために、IteratorがMatrixの内部ストレージに依存することは望ましくありません。この循環依存の問題をどのように解決できますか?

(内部Storageクラスには、Matrixクラスと同じテンプレートパラメーターと、Matrix自体と同じアクセスプロシージャがあります)

4

5 に答える 5

5

まず、Matrixクラスを前方宣言します。これにより、IteratorクラスはMatrixクラスの名前を確認し、それへのポインターと参照を作成できます。(Iteratorクラスがまだメンバーデータにアクセスしたり、メンバー関数を呼び出したりすることはできません。)

template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix;

次に、Iteratorクラスを定義します。この時点でできることは、マトリックスへの参照とポインターを保持することだけです。(Matrixのメンバーにはまだアクセスできません。)

template<typename T, typename Size>
class Iterator{
   // don't define any function bodies in here
   //but do put all data members and prototypes in here
};

次に、Matrixクラス(Iteratorメンバーにアクセスできる)を定義します

template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix{
   // don't define any function bodies in here
   //but do put all data members and prototypes in here
};

次に、各クラスのメソッド本体を定義します。この時点で、両方のクラスのメソッドが互いのメンバーにアクセスできます。通常、この部分は.cppファイルに含まれますが、テンプレートの場合は.hファイルに含まれます。

template<typename T, typename Size, typename Stack, typename Sparse>
Matrix<T,Size,Stack,Sparse>::Matrix(){ /*...*/}

template<typename T, typename Size>
Iterator<T,Size>::Iterator(){ /*...*/ }
于 2010-05-18T13:31:20.317 に答える
4

ここでは、ネストされたクラスを使用することも適切であり、必要なテンプレートパラメータの数を減らすことができます。

template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix{
public:
   class Iterator{
       // define Iterator members here
   };
   // declare Matrix members here
}
于 2010-05-18T13:50:11.860 に答える
2

反復するために、イテレータは通常、反復する内部ストレージについて知る必要があります。この結合は通常回避できません。たとえば、マップイテレータを考えてみましょう。マップが機能するためには、マップの内部ツリー構造について知る必要があります。

于 2010-05-18T13:25:13.777 に答える
1

テンプレートを前方宣言できます。次のようになります。

template<typename T> struct Foo;

template <typename T> struct Bar
{
    Foo<T>* foo;
};

template<typename T> struct Foo
{
        T value;
        Bar<T*> foobar;
};

void bla()
{
        Foo<int> grml;
}
于 2010-05-18T13:23:59.987 に答える
0

Matrixテンプレートを定義する前に、テンプレートを前方宣言しIteratorます。

Iterator<T, Size>念のために言っておきますが、が参照できないことに気付いたときは、レンガの壁にぶつかるでしょうMatrix<T, Size, Stack, Sparse>

于 2010-05-18T13:23:01.057 に答える