Probleme bei rein virtuellem Operator
-
Danke für die Tipps, ich werd das heute mal ausprobieren und mir wohl eine neue Funktion einfallen lassen müssen, um die abstrakten Klassen abstrakt zu halten.
-
Wenn dir gar keine andere Methode einfällt, die du abstrakt setzen kannst - nimm den Destruktor:
class base { public: ... virtual ~base() = 0; ... }; base::~base() {} //das hier ist notwendig, sonst können abgeleitete Klassen nicht zerstört werden
-
Cool, wusste gar nicht, dass das geht. Danke!
-
Sorry für den Doppelpost, aber...
@Volkard: Die Idee ist gut, aber wie könnte ich sowas verhindern?Konkrete_Klasse1 a; Konkrete_Klasse2 b; // Auch von Abstrakte_Klasse abgeleitet! cout << a == b;
Da Konkrete_Klasse1 und Konkrete_Klasse2 nicht die selben Attribute haben, geht das wohl kaum gut aus.
Irgendwelche Vorschläge?
[Edit] Geht ganz sicher ganz gut aus. Der Compiler kritisiert jetzt an jeder konkreten equals-Funktion, dass Abstrakte_Klasse dieses oder jenes Attribut nicht habe - Hilfe!Aja, nochwas: Wie kann man
funktion_xy(void) const;
mit einer rein virtuellen Funktion machen, so?
virtual funktion_xy(void) const = 0;
Sieht irgendwie seltsam aus, würde ich meinen.
-
Zweiundvierzig schrieb:
Aja, nochwas: Wie kann man
funktion_xy(void) const;
mit einer rein virtuellen Funktion machen, so?
virtual funktion_xy(void) const = 0;
Sieht irgendwie seltsam aus, würde ich meinen.
jo stimm so. Die konrete Implementation dann mit
virtual funktion_xy(void) const;
in der konkretenKlasse.
-
Zweiundvierzig schrieb:
Da Konkrete_Klasse1 und Konkrete_Klasse2 nicht die selben Attribute haben, geht das wohl kaum gut aus.
Irgendwelche Vorschläge?dynamic_cast ist jetzt dein freund.
-
volkard schrieb:
Zweiundvierzig schrieb:
Da Konkrete_Klasse1 und Konkrete_Klasse2 nicht die selben Attribute haben, geht das wohl kaum gut aus.
Irgendwelche Vorschläge?dynamic_cast ist jetzt dein freund.
Dann kann man doch auch gleich meine Lösung nehmen, oder net?
-
Mit dynamic_cast kann ich einfach diese Klasse entsprechend casten, ohne dass irgendwelche Nachteile entstehen? Oder muss ich auf irgendetwas achten?
-
Wenn die Klasse nicht gecastet werden kann wird ne Exception std::bad_cast geschmissenm, d.h. wenn bad_cast geschmissen wird, dann kann auch net verglichen werden.
-
Zweiundvierzig schrieb:
Konkrete_Klasse1 a; Konkrete_Klasse2 b; // Auch von Abstrakte_Klasse abgeleitet! cout << a == b;
Da Konkrete_Klasse1 und Konkrete_Klasse2 nicht die selben Attribute haben, geht das wohl kaum gut aus.
Irgendwelche Vorschläge?
[Edit] Geht ganz sicher ganz gut aus. Der Compiler kritisiert jetzt an jeder konkreten equals-Funktion, dass Abstrakte_Klasse dieses oder jenes Attribut nicht habe - Hilfe!Um beide Klassen zu vergleichen, solltest Du das mit Attributen machen, die beiden gemeinsam sind, d.h., Du solltest den operator== in einer gemeinsamen Basisklasse definieren (nicht nur deklarieren).
-
Ok, ich habe gerade gesehen, dass man einen Pointer dafür braucht. Tut's eine Referenz auch? Und kann man einen dynamic_cast auf ein constant-Objekt anwenden?
@tim_g: Das ist mir schon klar, aber ich will ja auch spezifische Attribute vergleichen können, die eben von Unterklasse zu Unterklasse verschieden sind.
-
Zweiundvierzig schrieb:
Ok, ich habe gerade gesehen, dass man einen Pointer dafür braucht. Tut's eine Referenz auch?
naa, nix gut referenz. die kann nicht so einfach 0 werden, um anzuzeigen, daß das casten nicht klapt.
ich dachte an
bool operator==(Abstrakte_Klasse& a,Abstrakte_Klasse& b){ return a.equals(b); }
nebst
bool Kinkrete_Klasse1::equals(Abstrakte_Klasse& b){ Kinkrete_Klasse1* pkk1=dynamic_cast<Kinkrete_Klasse1*>(&b); if(pkk1==0) return false; und ab hier die members von this und pkk1 vergleichen. }
aber es sind viele lösungen denkbar mit vielen vorteilen und nachteilen. und das da sieht für mich nicht toll aus. könnte aber klappen.
-
volkard schrieb:
Zweiundvierzig schrieb:
Ok, ich habe gerade gesehen, dass man einen Pointer dafür braucht. Tut's eine Referenz auch?
naa, nix gut referenz. die kann nicht so einfach 0 werden, um anzuzeigen, daß das casten nicht klapt.
ehm... volkard Bei Referenzen fliegt ne bad_cast exception , um anzuzeigen, dass der Cast net geht.
*duck und vor volkards antwort davonrenn*
-
bluecode schrieb:
ehm... volkard Bei Referenzen fliegt ne bad_cast exception , um anzuzeigen, dass der Cast net geht.
*duck und vor volkards antwort davonrenn*du hast http://www.c-plusplus.net/forum/viewtopic-var-t-is-144356-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html gelesen, gell?
-
Okay, danke für díe Hilfe. Ab jetzt komm ich alleíne klar.