2

最後に編集を参照してください

C++ で + 演算子をオーバーロードして、2 つの複素数を加算できるようにしようとしています。(実数を足して虚数を足す)。

ここに私のオーバーロードされた関数があります:

ComplexNum operator+(ComplexNum x, ComplexNum y){
ComplexNum result;
result.real = (x.getReal() + y.getReal());
result.imag = (x.getImag() + y.getImag());

return result;
}

私の複素数コンストラクターは 2 つの int を取り、1 つ目を int real に、2 つ目を int imag に割り当てます。

それらを追加しようとすると:

ComplexNum num1 = ComplexNum(1,1);
    ComplexNum num2 = ComplexNum(2,3);
    ComplexNum num3;
    num3 = num1 + num2;
    printf("%d",num3.getReal());

結果として 0 を取得します。結果は 3 になるはずです (num1 と num2 の実部を加算)

編集:何が間違っているのか分かりました。double を返す .getReal() と .getImage() がありました。

4

3 に答える 3

3

operator+ の引数は参照ではなく値として宣言されているため、コピーによって渡されます。そのため、ComplexNum のコピー コンストラクターが機能しない場合、x と y の実部が 0 になる可能性があります。

加算が機能する可能性もありますが、num3 の代入演算子を呼び出すと実数部が失われます。

または、壊れているのは単に getReal() メソッドである可能性があります。

于 2009-08-17T15:46:09.550 に答える
1

コピー コンストラクターまたは代入演算子のいずれかが壊れているように見えます。それらのコードも投稿できますか?

于 2009-08-17T15:44:44.387 に答える
0

補足: 実装する標準的な方法operator+は、 member の上にあるフリー関数としてoperator+=です。(同じことが-=*=などにも当てはまります。)任意のタイプ T の場合、次のようになります。

T operator+(const T& lhs, const T& rhs)
{
   T tmp(lhs); 
   tmp += rhs; //invoke +=
   return tmp;
}

この規則の理論的根拠 (IIRC、Stroustrup は Koenig に帰属します):

  • +and +=(and -and -=etc) はほぼ同じことを行います。冗長性を避けるために、一方を他方の上に実装する必要があります
  • +=左オペランドを変更する必要があるため、メンバーである必要があります。+引数をそのままにしておくので、自由な関数にする必要があります
  • 通常、メンバーの上に非メンバーを実装する方が簡単かつ/またはより効率的です。このケースも例外ではありません
于 2009-08-17T19:38:43.513 に答える