2017-02-21 6 views
-2

次のコマンドを実行すると、リストの最後のデータが失われ、前のデータが取得されます。カウンターを追加して1を引いてみるとクラッシュします。これについての助けがあれば幸いです。ポインタ演算でイテレータのend()関数が機能しない

template <typename T> 
Iterator<T> Iterator<T>::operator--() 
{ 
    ptr = ptr->backward; 
    return *this; 
} 

template <typename T> 
Iterator<T> DoublyLinkedList<T>::end() const 
{ 
    Iterator<T> iObj; 
    iObj.ptr = this->last; 
    iObj.capacity = this->count; 
    return iObj; 
} 


int main() { 
    DoublyLinkedList<int> *d = new DoublyLinkedList<int>; 


    for (int i = 2; i <= 20; i += 2) { 
     d->insertLast(i); 
    } 

    //Get an Iterator which points at the end of the list 
    Iterator<int> iter = d->end(); 
    --iter; 

    //Test that it does point to the first 
    checkTest("testIteratorsDecrement #1", 20, *iter); 
    //Test that our Iterator can move forward; 
    --iter; 
    checkTest("testIteratorsDecrement #2", 18, *iter); 

    //move it some more 
    for (int i = 0; i < 7; i++) { 
     --iter; 
    } 
    checkTest("testIteratorsDecrement #3", 4, *iter); 


    --iter; 
    checkTest("testIteratorsDecrement #4", 2, *iter); 


delete d; 
return 0; 

}

私は、次の手順を実行して、それを修正しようとするが、それはクラッシュします。 countは保護されたintです。

template <typename T> 
Iterator<T> DoublyLinkedList<T>::end() const 
{ 
    Iterator<T> iObj; 
    iObj.ptr = this->last + (count -1); 
    iObj.capacity = this->count; 
    return iObj; 
} 
+3

とすることをおすすめします。なぜ、最後の項目のアドレスにカウントを追加していますか? – Hal

+0

あなたはそれが1つだと思いますか?通常、終わりを過ぎたものを表しています。おそらくこれはあなたが見ているものです。もっと重要な点は、ここで作業するための再現可能な例が必要です(コンパイルできるもの) – OMGtechy

+0

私はもっとコードを追加しましたが、何とか間違ったリンクをリスト1に出力しました。最後に。 – HamHat

答えて

1

通常は逆参照できないセンチネル値を返します。最後のエントリへのポインタを返すように見えます。これは、off-by-oneエラーの原因です。

あなたのセンチネル値を選択することができますが、それはリスト内の有効なエントリであってはなりません。

脇に:イテレータに容量メンバを持つ正当な理由はありません。どのように最新の状態に保たれていますか?

+0

最終的には、右の目に見えないリンクを追加して、テストでフルキャパシティにアクセスできるようにします。 – HamHat

0

リストまたはベクトルとは異なり、リストはその要素を1つずつメモリに格納しません。 あなたの最初の要素は、の開始アドレス番地にあるかもしれませんが、次の要素はbegin5、またはbegin -10またはその他のものです。 これは、基本的には、リストの要素へのポインタで算術演算を行うことができないことを意味します。 何らかの最終要素が必要な場合は、リストの最後の要素をNULLPTR

関連する問題