Überlastung << und >> in vererbten Klassen
Habe ich die Klasse Person (Vorname, name, Adresse, Alter) und das überladen von Operatoren << und >> um es mit filestreams:
ostream& operator<< (ostream& outStream, Person& person)
{
...
}
istream& operator>> (istream& inStream, Person& person)
{
...
}
Funktioniert es einwandfrei - ich kann Lesen und schreiben Datei problemlos, aber ich habe zwei Klassen geerbt von Person: Student und Arbeiter.
Ich schrieb das überladen von Operatoren für Sie, sehr ähnlich zu denen oben:
ostream& operator<< (ostream& outStream, Worker& worker)
{
...
}
istream& operator>> (istream& inStream, Worker& worker)
{
...
}
ostream& operator<< (ostream& outStream, Student& student)
{
...
}
istream& operator>> (istream& inStream, Student& student)
{
...
}
Einzige Unterschied sind zwei weitere Felder in jeder Klasse. Das problem ist, das wenn ich das überladen von Operatoren, die entweder mit Studenten oder Arbeitnehmer-es scheint, mein compiler verwendet Operatoren, für die person. Wahrscheinlich macht es versteckte Umwandlung von Student oder Arbeiter zu Person, aber als Ergebnis gibt es keine solche zusätzliche Felder in die Datei geschrieben.
offstream << Menschen funktioniert das genauso wie offstream << Studenten oder offstrem Arbeitnehmer.
Vielleicht platzieren überladen von Operatoren Deklarationen für vererbte Klassen, die erste, und für die Person, die später im code würde das Problem auch lösen, aber ich finde es nicht eine elegante Lösung.
Wenn Sie haben einige Ideen, wie die Verwaltung mit dem problem oben, würde ich schätzen.
- Dies ist wahrscheinlich ein problem mit dem code, wo Sie anrufen << und >>. Kannst du etwas code im umliegenden Bereich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei Dinge. Machen Sie sich zunächst Ihre Betreiber nehmen Referenzen auf const, so wie hier:
Um Ihr problem zu lösen, ein gemeinsames Muster ist, um Ihren Typen mit einer geschützten virtuellen
toString
Methode, und haben die Betreiber nur Anrufe. Sie können Sie dann einfach überlastung dieser Methode in die sub-Klassen, und sogar die Wiederverwendung der super-Klasse Umsetzung, wenn Sie wollen einfach nur, um anzufügen, dass einige Werte auf die Zeichenfolge.Beispiel:
Bearbeiten
Eigentlich mag ich larsmans Vorschlag noch besser:
Einfacher zu implementieren als die
toString
Idee, da braucht man keine temporärenstringstream
oder etwas dergleichen zu bauen, die den string.virtual void print(std::ostream &) const
undvirtual void read(std::istream &)
.toString()
undprint()
Funktionen passen in Sprachen wie Java, die keine freien Funktionen, aber nicht in C++.Person *p = new Student(); std::cout << *p;
Wahrscheinlich der code ruft die
<<
operator greift auf das Objekt über einen Zeiger oder ein Verweis auf Person, so ruft den operator für die Person geben. Die übliche Art des Umgangs mit diesen ist eine virtuelle Methode, die auf der übergeordneten (d.h. Person) Klasse, die die Schrift (die stream als argument), und dieoperator<<
diese Methode aufrufen, um die Arbeit zu tun. Sie müssen denoperator<<
nur für die übergeordnete Klasse, die virtual dispatch-Mechanismus kümmern sich um die Wahl der richtigen Methode für die Objekt zur Verfügung gestellt.Ihre Betreiber könnte der Aufruf einer virtuellen Methode. So etwas wie dieses :
Dann erstellen Sie den operator<< nur für die Basis-Klasse :
Ich in der Regel rufen Sie eine virtuelle Funktion streamIn und streamOut in der überladene streaming-Operatoren, so kann ich eigentlich eine Vorlage erstellen, die streaming-Funktion, das funktioniert für alle Klassen mit streamIn und streamOut-Funktionen.