57

operator++プリインクリメントとポストインクリメントをオーバーロードできますか? つまり、呼び出しSampleObject++++SampleObject正しい結果が得られます。

class CSample {
 public:
   int m_iValue;     // just to directly fetch inside main()
   CSample() : m_iValue(0) {}
   CSample(int val) : m_iValue(val) {}
   // Overloading ++ for Pre-Increment
   int /*CSample& */ operator++() { // can also adopt to return CSample&
      ++(*this).m_iValue;
      return m_iValue; /*(*this); */
   }

  // Overloading ++ for Post-Increment
 /* int operator++() {
        CSample temp = *this;
        ++(*this).m_iValue;
        return temp.m_iValue; /* temp; */
    } */
};

戻り値の型だけに基づいて関数をオーバーロードすることはできません。また、許容されたとしても、オーバーロード解決のあいまいさのために問題は解決しません。

組み込み型をユーザー定義型のように動作させるために演算子のオーバーロードが提供されているのに、独自の型のプリインクリメントとポストインクリメントを同時に利用できないのはなぜでしょうか?

4

4 に答える 4

101

インクリメント演算子の後置バージョンは、あいまいさを解消するためにダミーintパラメーターを取ります。

// prefix
CSample& operator++()
{
  // implement increment logic on this instance, return reference to it.
  return *this;
}

// postfix
CSample operator++(int)
{
  CSample tmp(*this);
  operator++(); // prefix-increment this instance
  return tmp;   // return value before increment
}
于 2013-03-06T10:02:44.200 に答える
27

タイプ T のプリインクリメントとポストインクリメントの標準パターン

T& T::operator++() // pre-increment, return *this by reference
{
 // perform operation


 return *this;
}

T T::operator++(int) // post-increment, return unmodified copy by value
{
     T copy(*this);
     ++(*this); // or operator++();
     return copy;
}

(インクリメントを実行するための共通関数を呼び出すこともできます。または、メンバーの ++ のような単純なワンライナーの場合は、両方で実行してください)

于 2013-03-06T12:29:10.133 に答える
13

独自の型に対して事前インクリメントと事後インクリメントの両方を同時に利用できないのはなぜですか。

あなたはできる:

class CSample {
public:

     int m_iValue;
     CSample() : m_iValue(0) {}
     CSample(int val) : m_iValue(val) {}

     // Overloading ++ for Pre-Increment
     int /*CSample& */ operator++() {
        ++m_iValue;
        return m_iValue;
     }

    // Overloading ++ for Post-Increment
    int operator++(int) {
          int value = m_iValue;
          ++m_iValue;
          return value;
      }
  };

  #include <iostream>

  int main()
  {
      CSample s;
      int i = ++s;
      std::cout << i << std::endl; // Prints 1
      int j = s++;
      std::cout << j << std::endl; // Prints 1
  }
于 2013-03-06T10:06:06.163 に答える