0

重複の可能性:
ファンクターの戻り値のタイプを推測する方法は?

次の例を考えます。

<type>& operator+(const <type>& rhs) {
   // *this.data + rhs
}

タイプ<タイプ>のオブジェクトの合計の値を返すにはどうすればよいですか?

私がコーディングした場合:

<type>& operator+(const <type>& rhs) {
   <type> cell;
   switch(rhs.type {
   case DOUBLE:
   {
     cell.data = (double)cell.data + (double)rhs.data;  
   }
   return cell;
}

一時的なスタック値を返し、エラーメッセージを受け取ります。

私がコーディングした場合:

<type>& operator+(const <type>& rhs) {
  *this.data = *this.field + rhs.data;
  return *this;
}

追加の意図ではないこれを上書きします。

これは単なる例です。「実際の」コードでは、任意の数の入力データ型を追加(減算、...)できる必要があります。これにより、戻り値がいくつかの型のいずれかに対応できる必要があります。 。

4

2 に答える 2

11

operator+参照ではなく、値で返す必要があります。オペレーターは左側または右側を変更するべきではないため、変更するには3番目のオブジェクトが必要です。関数内に作成する必要があります。また、ローカル変数への参照を返すことはできないため、最善の方法は値で返すことです。

<type> operator+(const <type> &rhs) {
  <type> sum = *this;
  sum.data = sum.data + rhs.data;
  return sum;
}

とにかく左側を変更することになっているので、代わりにそれoperator+=は参照によって戻る必要があります。+=

<type> &operator+= (const <type> &rhs) {
    this->data += rhs.data;
    return *this;
}

そして+、の観点から実装できます+=

<type> operator+(const <type> &rhs) {
  <type> sum = *this;
  return sum += rhs;
}

また、通常operator+は非メンバー関数として実装されるため、右側と左側の両方で変換が正常に機能します。左側のメンバー関数の変換は同じとは見なされません。

<type> operator+(<type> lhs, const <type> &rhs) {
    return lhs += rhs;
}

さらに、この方法では、左側を値で取得し、コピー/移動エリジオンを利用できます。

于 2012-12-11T22:56:03.597 に答える
0

最も簡単でおそらく最善の方法は、戻り値の型を から に変更すること<type>&です<type>

于 2012-12-11T22:57:02.937 に答える