0

だから私は次の方法があります:

template <class DT> //needs testing
DT& LinkedSortedArrays<DT>::find (const DT& key)
{
    list<SortedArray<DT>>::iterator it = SAList.begin();
    for( ; it != SAList.end(); ++it){
        try{
            if (it == SAList.begin() && key < (*it)[0]) throw Exception();
            return (*it).find(const_cast<DT&> (key));
        } catch (ArrayException e) {

        }
    }
    throw Exception();
}

以前にクラスExceptionとを定義しましたArrayException。現時点で検索されている特定の Array クラスで見つからない(*it).find(const_cast<DT&> (key))たびに ArrayException をスローします。です。コードは問題なくコンパイルされます。しかし、私は自分のプログラムでそれを試していません。なんで?私が行った次の仮定について、誰かが私を確認または修正する必要があります。keySAListSTL List

  1. が例外をスローするときはいつでもif (it == SAList.begin() && key < (*it)[0]) throw Exception();、for ループの外、さらにはメソッドの外でも例外をスローするということですよね?
  2. throw Exception();最後の行がメソッドの外側で例外をスローすることはほぼ確実です。
  3. for ループの配置では、SAList の最初の要素をスキップしませんよね。つまり、リストのすべての要素を標準または完璧であるかのように反復処理するこの特定のコードをインターネット全体で見たことがありますが、それ++itは私の頭をねじっています。ヘルプ?
  4. のエラーを受け取っていましたcan't convert const int to int&( find()in(*it).find(const_cast<DT&> (key))はに属するものではLinkedSortedArraysなく、DT& 変数を必要とし、 const DT& 型LinkedSortedArraysfind()パラメーターを持っている別のものであるため)、可能な解決策はそれをconst_cast<DT&> (key). これについてセカンドオピニオンが必要です。

最後に、これが特定の質問ではないため、反対票を投じたり、質問がクローズされたりするかどうかを理解しています。他にどこに聞いたらいいのかわからないだけです。間違った場所で質問している場合。謝罪いたします。

4

1 に答える 1

2
  1. catchはい、適切なハンドラーが見つかるまでスタックを上に移動します。そのようなハンドラが見つからない場合、プログラムは終了します。

  2. はい、そうなります。

  3. いいえ、そうではありませんend。最後の要素ではなく、最後の 1 つ後ろにイテレータを返す必要があるためです。そのコンテナの設計が悪い場合を除きますが、ドキュメントを参照して確認する必要があります。

  4. これは悪い設計です。参照findによってパラメーターを取得する必要があります。constできないため、未定義の動作を危険にさらしたくない場合を除き、コピーを作成する必要があります。

    DT nonconstkey = key;
    return it->find(nonconstkey);
    
于 2012-10-23T22:07:05.797 に答える