2017-02-16 15 views
0

友達関数を使用してプリインクリメント演算子をオーバーロードしました。オーバーロードされたfriend関数では、変数の値が正しく表示されています。しかし、その値は表示機能には表示されません。なぜですか?オーバーロードプリインクリメント演算子が正しい結果を表示しない

#include <iostream> 
using namespace std; 

class Rectangle { 
public: 
    int breadth; 

public: 
    void read(); 
    void display(); 
    friend void operator ++(Rectangle r1); 
}; 
void Rectangle::read() 
{ 
    cout << "Enter the breadth of the Rectangle: "; 
    cin >> breadth; 
} 
void operator++(Rectangle r1) 
{ 
    ++r1.breadth; 
    cout<<r1.breadth<<endl; //correct result 
} 
void Rectangle::display() 
{ 
    cout<<breadth<<endl; // not showing pre-incremented value, why ??? 
} 
int main() 
{ 
    cout<<"Unary Operator using Friend Function \n"; 
    Rectangle r1; 
    r1.read(); 
    ++r1; 
    cout << "\n breadth of Rectangle after increment: "; 
    r1.display(); 
    return 0; 
} 
+1

"Rectangle r1"とは、渡されたものに基づいたポインタ、参照、またはコピーされたオブジェクトとは何ですか? – UKMonkey

+1

++演算子はメンバではない関数なので、矩形のコピーをインクリメントします。 – tambre

+3

++演算子はメンバ関数として実装する必要があります。 – tambre

答えて

8

あなたoperator ++は、そのオペランドのコピーを受ける意味し、値によってRectangleオブジェクトを受け取ります。次に、コピーのbreadthメンバーを忠実にインクリメントして印刷し、終了したらコピーを破棄します。

あなたが参照によってパラメータを取るしたいと思う:

friend void operator ++(Rectangle &r1) 
{ 
    ++r1.breadth; 
} 

はまた、メンバ関数の代わりに、自由な機能を使用して単項演算子をオーバーロードするためにかなり一般的だということに注意してください。そのように使用され、あなたがこの問題を持っていないでしょう。

class Rectangle 
{ 
    // ... 

public: 
    void operator++() 
    { 
    ++breadth; 
    } 

    // ... 
}; 

少数側のコメント:

  • operator++が内蔵されたものをオペレータ模倣するために、そのオペランドへの参照を返すことが一般的です行う。 int iの場合は++ ++ iと同じように、ユーザー定義のタイプrの場合は++ ++ rとする必要があります。

  • 実際には、オペレータのオーバーロードは、a)組み込み型と同様に動作する型を記述している場合、またはb)ドメイン固有の言語を記述している場合にのみ使用してください。矩形をインクリメントすることは、私が直感的に説明できるものではなく、名前付きメンバ関数として最もうまくいくでしょう。 ++rが幅、高さ、またはその両方を増やすのか、または長方形を右に移動するのか、または...をどうやって伝えることができますか?

+0

また、インクリメントオーバーロードをメンバ関数として持つためのソリューションを示す必要があります。 – tambre

+0

@tambreそれを正しく行う方法を示したければ、[オペレータオーバーロードに関するよくある質問](http://stackoverflow.com/questions/4421706/operator-overloading)を参照してください。 – moooeeeep

+2

最後の箇条書きポイントは*大いに重要です*。これは、過負荷の操作を使用することが非常に貧弱です。 (運があれば、それは教師による問題の貧弱な選択肢です)。 –

関連する問題