Der Grund für den Compilerfehler ist eine zirkuläre Abhängigkeit. Jede Ihrer operator =() -Funktionen erfordert die Kenntnis der operator =() -Funktion innerhalb der anderen Klasse. Daher wird es immer einen Fehler geben, unabhängig davon, in welcher Reihenfolge Sie Ihre Klassen definieren.
Hier ist eine Möglichkeit, es zu lösen. Es ist nicht sehr elegant, aber es wird tun, was Sie wollen:
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; }
Sie können auch in der Lage sein, dieses Problem mit Vererbung zu lösen.
bearbeiten: Hier ist ein Beispiel mit Vererbung. Dies funktioniert, wenn das Kopierverfahren nur Zugriff auf einige gemeinsame Daten benötigt, die von A und B gemeinsam genutzt werden, was wahrscheinlich wäre, wenn der = Operator irgendeine Bedeutung haben soll.
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; }
};
Ich frage mich, wie willst du das verwenden? –
Bumhunter. Hm ... –
@Earwicker: wem war das? –