0

次のコードは無限ループに入ります。

#include <string>
#include <iostream>
using namespace std;

class A{
   public:
      A(){
         cout << "Normal constructor" << endl;
      }
      A(const A& moo){
         cout << "It's a constructor!" << endl;
         operator=(moo);
      }
      void operator=(const A& moo){
         cout << "Calling A::Operator=" << endl;
      }
};

class B : public A{
   public:
      B(){}
      B(const A& thea){
         cout << "Gotshere" << endl;
         operator=(thea);
      }
};


int main(){

   B b;

   b = A();

}

無限ループの出力は、「通常のコンストラクター」と「Gotshere」の間を循環します。クラスに anをmain割り当てるときに、存在しないを呼び出そうとする関数から推測しているので、代わりに再度呼び出します。ABB::operator=B(const A&)

私が得られないのは、なぜA()呼び出されるのかです。誰か知っていますか?EDITはこれを明確にする必要があり、無限ループで繰り返しA()呼び出されます。

もちろん、修正は置くことB::operator=(const A&)ですが、なぜそれをしているのか知りたいです。

さらに、 class の演算子を追加しましたB:

void B::operator=(const A&) { cout << "That should fix things. A::Operator=" << endl; }

そして、問題は修正されましたが、修正すると、「B::operator=」の代わりに出力がB b; b = B()得られます。Calling A::operator=何故ですか?

4

2 に答える 2

2

B :: operator =はB&を取りますが、A&を渡しているため、Aから新しいBを作成する必要があります。これにより、無限再帰が発生します。

2番目の質問です。B :: operator =(const A&)を定義しましたが、const B&を取る代入演算子は引き続き自動的に生成され、自動生成された代入演算子は基本代入演算子を呼び出します。

于 2012-05-26T04:37:18.147 に答える
2

私が得られないのは、 A() が呼び出される理由です。誰か知っていますか?

Bを継承するAため、 を構築する前にB、 のAコンポーネントを構築するB必要があります。A呼び出したいコンストラクターを指定していないため、コンパイラーはデフォルトのコンストラクターを選択します。

EDIT(質問の編集に応じて)

一部を繰り返し呼び出すAことに関する限り、ここであなたのロジックが間違っています:あなたは言った

B::operator=存在しないを呼び出そうとするため、代わりに B(const A&) を再度呼び出します。

しかし、これは起こっていることではありません:Aの operator を呼び出すのではなく、コンパイラが無償で生成したの operatorを=呼び出します。確認するには、行を に変更すると、無限再帰が消えます。B=A::operator=(thea);

では、なぜ無限再帰なのか? 生成された代入演算子の署名が

B& operator=(const B& b)

コンパイラは に渡すために のインスタンスを必要としますが、 のインスタンスをB渡しoperator=ていますABただし、その takesのコンストラクターを定義しましたconst A&const A&これは、次のように、一時的な B を作成し、 から構築し、 を呼び出すことによって、コンパイラが正しい呼び出しを生成するのに十分ですB::operator=

B temp(thea); <<== At this point, you're in an infinite recursion
B::operator=(temp);

ちなみに、C++ での代入は lval であるため、代入演算子のオーバーロードは、代入先のオブジェクト (つまり*this) を参照によって返す必要があります。

A& operator=(const A& moo){
    cout << "Calling A::Operator=" << endl;
}
于 2012-05-26T04:30:39.477 に答える