2017-05-21 20 views
1

単項演算子が動作しない理由を理解できません。私はいくつかの概念が欠けていると確信しています。助けてください。演算子予期しない結果のオーバーロード

#include <iostream> 
using namespace std; 

class Distance { 
    private: 
     int feet;    // 0 to infinite 
     int inches;   // 0 to 12 
    public: 
     // required constructors 
     Distance(){ 
     feet = 0; 
     inches = 0; 
     } 
     Distance(int f, int i){ 
     feet = f; 
     inches = i; 
     } 
     // method to display distance 
     void displayDistance() { 
     cout << "F: " << feet << " I:" << inches <<endl; 
     } 
     // overloaded minus (-) operator 
     Distance operator-() { 
     return Distance(-feet, -inches); 
     } 
}; 

int main() { 
    Distance D1(11, 10), D2(-5, 11); 

    -D1;      // apply negation 
    D1.displayDistance(); // display D1 

    -D2;      // apply negation 
    D2.displayDistance(); // display D2 

    return 0; 
} 

出力は次のようになります。

F: 11 I:10 
F: -5 I:11 

そして私はそれが私が概念をしないのですどこ-11 -10と5と

-11わからないことが期待しました。ところで、私はそれを新しいDistanceオブジェクトを返しますhere

+1

'int n = 5; -5; cout << n << endl; '4を印刷すると思いますか? – juanchopanza

+0

@元祖パンジャー!私はそれが5と-5を印刷することを期待しています –

+1

私はどのようにそれらがあなたが示しているまったく同じ出力を表示するそのWebサイトで好きです。どうやら彼らはコンソールからそれをコピーしたことはありませんでした。そして、この出力は、議論されたオペレータのオーバーロードがうまくいかなかったことを示しています。なぜ偽のチュートリアルを使用するのか(http://stackoverflow.com/q/388242/11683)の別の例 – GSerg

答えて

5

これらの行

-D1;      // apply negation 
-D2;      // apply negation 

を行う必要があります。 という変数があるとします:

int var = 3; 
-var; // What does this do? 

これはどうしますか? -varは、~-3と評価されますが、は変更されません。var-3と等しくなります。あなたのDistanceタイプと

var = -var; // Now var == -3 

同じ取引:あなたはvarを変更したい場合は、通常どおり、あなたはそれに割り当てます。 -D1D1を変更しません。に変更しないでください。これは単項型のoperator-が期待しているものではないためです。次のように負のバージョンを自分自身に戻すだけです:

D1 = -D1; 
+0

そして私は馬鹿だと感じる。ありがとう! –

+0

@VidorVistrom私たちは間違いを犯す方法です:) – InternetAussie

1

あなたの単項否定演算子を発見し、それが既存のオブジェクトを変更しません。

Distance D3 = -D1; 
D3.displayDistance(); 
+0

既存のものを変更したいのですが? –

+2

@VidorVistrom 'D1 = -D1'のように返すだけです。 –

+0

@VidorVistromそれでは、コードを書く必要があります。しかし、通常、単項否定演算子はインスタンスを変更すべきではありません。 – juanchopanza

0

あなたは新しいオブジェクトを返しますが、どこにでも保存することはできません。

あなたは、彼らがやっていると思う何をしていないD1 = -D1;

関連する問題