2

C ++のconst型に関しては、私はいつも迷子になります。私の問題は本質的にこれらにあります。

次のような状況があります。基本的に2次元のリンクリスト(センチネルを持つリング)であるクラスMatrixと、行を選択して(行を選択する方法)、通過できるイテレーターのようなクラスがあります。それ(operator ++)。これを取得するために、イテレータは3つのポインタを格納します。メインセンチネル、選択されたサブリスト(行)のセンチネル、および現在選択されているノード(カレットという名前を付けましょう)です。operator ++がサブリストセンチネルにヒットした場合-行の終わりに到達し、行選択がメインセンチネルにヒットした場合、マトリックスの終わりに到達しました。

ここで、リストは単一リンクされており、イテレーターに削除機能を提供させたいのでNode**、現在のノードフィールドのタイプをイテレーターに格納することにしました。しかし、これはコンストラクターでいくつかの問題を引き起こします。

私は、2つのタイプのコンストラクターを許可することにしました。1つはMatrixを使用し、もう1つは他のイテレーターを使用します。そして、これが私の問題です。マトリックスから作成されたイテレーターの初期状態では、すべてのポインターが同じポイント(メインセンチネル)にあります。さて、g ++が私に言っていることから、私のコンストラクターMatrixは型をとらなければならないようconst Matrix&です。しかし、もしそうなら、私は自分のカレット(であるNode**)にマトリックス自身のポインターへのポインターを割り当てることができません。なぜなら、それはconstであり、カレットはconstではないからです。

どうすればこれを解決できますか?コンストラクターが非定数エンティティを取得できないのはなぜですか?コンストラクター内でマトリックスをconstからnon-constに変換できますか?そのためのヒントを事前に感謝します。

4

1 に答える 1

1

Matrix と iterator を分離する必要があります。これにより、反復処理によって Matrix が変更されず、反復処理に必要なデータが iterator クラスに格納されます。

さらに、const Matrix オブジェクトを操作するためにイテレーターが必要な場合は、const イテレーターも提供する必要があります。これにより、マトリックスへの const 参照/ポインターを使用できます。しかし、コピー コンストラクターでは、これは必ずしも必要ではありません。フィールドに直接アクセスするだけで済みます。結局のところ、同じクラスです。

反復子クラスが Matrix の内部にアクセスできるようにするには、friend キーワードを使用するか、または (できれば) 反復子クラスを Matrix の内部クラスにすることができます。

于 2012-12-14T19:48:02.847 に答える