Hier ist eine sehr einfache Klassenhierarchie:Wo sollte! = Operator in einer Klassenhierarchie definiert werden?
class A
{
public:
A(int _a) : a(_a) {}
virtual bool operator==(const A& right) const
{
return a == right.a;
}
virtual bool operator!=(const A& right) const
{
return !(*this == right);
}
int a;
};
class B : public A
{
public:
B(int _a, int _b) : A(_a), b(_b) {}
virtual bool operator==(const B& right) const
{
return A::operator==(right) && b == right.b;
}
int b;
};
Wie Sie sehen können, Operator = wird in der Basisklasse definiert. Da ich sehr faul bin, möchte ich einen solchen einfachen Code nicht in allen abgeleiteten Klassen duplizieren.
Unfortunatley, mit diesem Code:
A a4(4), a5(5), a4bis(4);
assert(a4 == a4bis);
assert(a4 != a5);
B b1(4,5), b2(4,6);
assert(!(b1 == b2));
assert(b1 != b2); // fails because B::operator== is not called!
b1 != b2
false zurück, weil es führt A::operator!=
, welche Anrufe dann A::operator==
anstatt B::operator==
(auch wenn der Bediener virtuell ist, als abgeleitete Klasse Version Parameter unterschiedlich ist, sind sie nicht in der vtable verknüpft).
Also, was ist der beste Weg zu Adresse! = Operator in einer generischen Weise für eine Klassenhierarchie?
Eine Lösung ist es in jeder Klasse zu wiederholen, würde B
dann haben:
virtual bool operator!=(const B& right) const
{
return !(*this == right);
}
Aber das ist ein Schmerz, wenn Sie viele Klassen haben .... Ich habe 30 ....
eine andere Lösung wäre, eine generische Vorlage Ansatz haben:
template <class T>
bool operator!=(const T& left, const T& right)
{
return !(left == right);
}
Aber dies umgeht alle !=
Betreiber von jeder Klasse definiert .... so es riskant sein kann, wenn man Decla rot es anders (oder wenn man eine ==
selbst anruft !=
, würde es mit einer Endlosschleife enden ...). Ich halte diese Lösung für sehr unsicher ... außer, wenn wir die Vorlage auf alle Klassen beschränken können, die von der obersten Klasse unserer Hierarchie abgeleitet sind (A
in meinem Beispiel) .... aber das tue ich nicht denke, das ist überhaupt machbar.
Hinweis: Ich benutze C++ 11 noch nicht ... tut mir leid.
Darüber hinaus, derzeit, A (42) == B (42, 0) 'wie Sie nur die" A "Teil vergleichen ... – Jarod42
Aus Gründen der Klarheit und um sicherzustellen, dass A weiterhin unabhängig arbeitet (wenn Sie nicht ' t wollen Sie es, Sie müssen B nicht von ihm ableiten), implementieren Sie! = für A, B, C, D und was immer Sie in Ihrer Hierarchie haben. Auch wenn Sie sie nicht brauchen, warum müssen Sie überhaupt ableiten? – Robinson