1

オーバーロードの概念を使用して、 3つのオブジェクトc1、、を同等にしようとしています。しかし、それは私にエラーを与えていますc2c3

error: no match for 'operator=' in 'c3 = c2. circle::operator=(((circle&)(& c1)))'

その背後にある理由は何ですか?どうすれば修正できますか?

#include<iostream>
using namespace std;

class circle
{
  private:
    int radius;
    float x,y;
  public:
    circle()
    {}
    circle(int rr,float xx,float yy)
    {
      radius=rr;
      x=xx;
      y=yy;
    }
    circle& operator=(const circle& c)
    {
     cout<<endl<<"assignment operator invoked";  
     radius=c.radius;
     x=c.x;
     y=c.y;
     return *this;
     }
    void showdata()
    {
      cout<<endl<<"\n radius="<<radius;
      cout<<endl<<"x coordinate="<<x;
      cout<<endl<<"y coordinate="<<y<<endl;
    }
};
int main()
{
  circle c1 (10,2.5,2.5);
  circle c2,c3;
  c3=c2=c1;
  c1.showdata();
  c2.showdata();
  c3.showdata();
  return 0;
} 

したがって、このオーバーロードされた演算子は2回呼び出されます。最初にc2 = c1に対して、次にc3 = c2に対して呼び出されますが、コンパイラーはオーバーロードされた演算子定義とどのように比較しますか?

4

1 に答える 1

6

呼び出しをチェーンするoperator=には、参照を返すことを確認する必要があります

circle& operator=(const circle& c)
{
   cout<<endl<<"assignment operator invoked";  
   radius=c.radius;
   x=c.x;
   y=c.y;
   return *this;
}

c1=c2=c3として解析されc1 = (c2 = c3)ます。operator =参照を返さない場合c2 = c3、右辺値であり、参照引数にバインドできませんc1.operator =(引数が const への参照である場合、右辺値にバインドできますが、それは返してはならないという意味ではありません参照)。

また、割り当てた引数を変更したくないため、const 参照によってパラメーターを取得するのが理にかなっていることにも注意してください。

また、次のいずれかを本当に行う必要がある場合は、3 のルールを覚えておいてください。

  • 過負荷operator =

  • 明示的にコピー コンストラクターを提供する

  • デストラクタを明示的に提供する

その後、おそらく他の 2 つも実行する必要があります。あなたの特定のケースでは、オーバーロードする必要はまったくないようですoperator =

于 2012-07-13T08:15:12.787 に答える