コンパイラエラーの原因は循環依存です。それぞれのoperator =()関数は、他のクラスのoperator =()関数に関する知識を必要とするので、クラスを定義する順序に関係なく、常にエラーが発生します。
これを並べ替える方法が1つあります。それは非常にエレガントではありませんが、それはあなたがやりたいことになります。
class A;
class B;
A & set_equal(A & a, const B & b);
B & set_equal(B & a, const A & a);
class A
{
private:
int x;
public:
A & operator=(const B & b) { return set_equal(*this, b); }
friend B & set_equal(B & b, const A & a);
friend A & set_equal(A & a, const B & b);
};
class B
{
private:
int y;
public:
B & operator=(const A & a) { return set_equal(*this, a); }
friend A & set_equal(A & a, const B & b);
friend B & set_equal(B & b, const A & a);
};
A & set_equal(A & a, const B & b) { a.x = b.y; return a; }
B & set_equal(B & b, const A & a) { b.y = a.x; return b; }
ます。また、継承してこの問題を解決できることがあります。
編集:ここでは継承を使用した例です。これは、コピー手順がAとBの両方で共有されるいくつかの共通データへのアクセスのみを必要とする場合に機能します。これは、=演算子がまったく意味を持つように思われるでしょう。
class A;
class B;
class common
{
protected:
int x;
void copyFrom(const common & c) { x = c.x; }
};
class A : public common
{
public:
A & operator=(const common & c) { copyFrom(c); return *this; }
};
class B : public common
{
public:
B & operator=(const common & c) { copyFrom(c); return *this; }
};
これはどのように使用するのですか? –
Bumhunter。うーん... –
@ Earwicker:それは誰ですか? –