Frage zu abstrakten Klassen
-
Beschäftige mich noch nicht so lang mit C++ und habe folgendes Problem:
von der abstrakten Basisklasse PObject#include <typeinfo> #include <iostream> using namespace std; class PObject { public: virtual ~PObject() {}; bool sameClass(const PObject& a) const; // true, wenn a von der gleichen // Klasse wie das aktuelle Objekt // ist, sonst false const char* className() const; // Rückgabe des Klassennamens virtual bool equals(const PObject& a) const = 0; virtual void output(ostream& out) const = 0; virtual void input(istream& in) = 0; virtual PObject& operator=(const PObject&) = 0; }; inline bool PObject::sameClass(const PObject& a) const { if (&typeid(this)==&typeid(a)) return true; else return false; } inline const char* PObject::className() const { return typeid(this).name(); } inline bool operator==(const PObject& a, const PObject& b) { return a.equals(b); } inline bool operator!=(const PObject& a, const PObject& b) { return !a.equals(b); } inline ostream& operator<<(ostream& out, const PObject& a) { a.output(out); return out; } inline istream& operator>>(istream& in, PObject& a) { a.input(in); return in; }
wird die u.a. die Klasse PInteger abgeleitet
#include "PObject.h" class PInteger : public PObject { public: PInteger (int=0); //Konstruktor für einen Parameter mit Defaultwert 0 PObject& operator=(const PObject&); PInteger& operator=(const PInteger&); bool equals(const PObject & a) const; void input(istream& in); void output(ostream& out) const; private: int wert; };
Wie implementiere ich die equals Methode?
bool PInteger::equals(const PObject & a) const { //?? }
Rückgabewert true wenn Werte gleich sind sonst false.
Mein Problem, wie komme ich an den Wert des PObject Objektes? Die Basisklasse hat ja keine Datenkomponenten. Habe schon dynamic_cast probiert. Das scheitert aber, weil const class PObject nicht in class PInteger konvertiert werden kann.
Bin für jede Idee dankbar.
-
Du könntest theoretisch
void Integer::equals(Object const &p) { Integer const &i=dynamic_cast<Integer const &>(p); //... }
machen.
Aber ich finde den Ansatz nicht ok, da
(a) wäre das unnötig langsam
(b) würde es ja nicht direkt verbieten, dass man so etwas machtclass Integer : public Object { /*...*/ }; class Character : public Object { /*...*/ }; int main() { Integer i; Character c; i==c; }
Was einem plötzlich um die Ohren fliegt, ohne das man erstmal weiss warum.
-
Danke, es funktioniert.
zu (b): ist theoretisch möglich.
Dafür gibt es aber die sameClass Methode. Nur wenn Objekte von der gleichen Klasse sind, darf verglichen werden.