0

カスタム List クラスに取り組んでいます。iterator と const_iterator とその関数を実装しようとしていますが、++ 演算子に問題があります。PostFix はまったく機能せず、PreFix は、踏み込みすぎると segfault を返します (現在のコードは、最後の有効な結果を返すだけの回避策です)。質問 1: 最後の有効な要素を返さずに、プレフィックスに関連するセグメンテーション違反を修正するにはどうすればよいですか? (nullptr を返そうとしました)。

インターネット上のすべてのガイドに従っているにもかかわらず、Postfix は反復しません <.<

質問 2: PostFix が機能しないのはなぜですか?

接頭辞のコード(&P):

List_const_iterator_& operator++()
  {
    if(ptr->next_ != nullptr)
    {
        ptr = ptr->next_;
        return *this;
    }
    else
        return *this;
  }

  List_const_iterator_ operator++(int unused)
  {
    List_const_iterator_ temp(*this);
    if(ptr->next_ != nullptr)
    {
      ptr = ptr->next_;
      return temp;
    }
    else
      return *this;
  }

テストコード (接尾辞付きの atm):

List<int> list1 {324, 2, 3};
  List_const_iterator_<int> clst = list1.cbegin();
  clst = clst++;
  cout << "val: " << clst.ptr->data_ << endl;
  clst = clst++;
  cout << "val2: " << clst.ptr->data_ << endl;
 clst = clst++;
  cout << "val3: " << clst.ptr->data_ << endl;

後置の出力:

val: 324
val2: 324
val3: 324

プレフィックスの出力:

val: 2
val2: 3
val3: 3  <-- This is where we segfault if we don't use the controll.
4

1 に答える 1

2

だけで試してください:

clst++;

それ以外の :

clst = clst++;

後者clstは元の値にリセットされます (インクリメントが発生しなかったかのように)。

于 2014-04-10T09:17:40.857 に答える