Ich habe eine Klasse, die eine Friend-Funktion verwendet, um den Operator >> zu überlasten. Die überladene Operator-Methode testet gut auf Standard-cin-Verwendung. Wenn ich versuche, den Code zu aktualisieren, um Istream-Objekte anstelle von iStream-Objekten zu verwenden, wird der Prototyp jedoch nicht als gültige Methode erkannt.Warum verwendet fstream den istream-Prototyp des Operators nicht?
Es ist mein Verständnis, dass ifstream von istream geerbt wird, und als solches sollte Polymorphismus Ifstream-Objekten erlauben, mit der istream überladenen Funktion zu arbeiten. Was stimmt nicht mit meinem Verständnis?
Muss die Funktion für jeden Eingabestreamtyp dupliziert werden?
Klasse:
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
class Hospital {
public:
Hospital(std::string name);
std::string getName();
void write();
friend ostream & operator<<(ostream &os, Hospital &hospital);
friend istream & operator>>(istream &is, Hospital &hospital);
private:
void readFromFile(std::string filename);
std::string m_name;
};
Funktion Umsetzung:
istream &operator>>(istream &is, Hospital &hospital){
getline(is, hospital.m_name);
return is;
}
Fehler:
Hospital.cpp: In member function ‘void Hospital::readFromFile(std::string)’: Hospital.cpp:42:24: error: no match for ‘operator>>’ (operand types are ‘std::ifstream {aka std::basic_ifstream}’ and ‘Hospital*’) storedDataFile >> this;
Dieser Fehler nach einem Aufruf von Readfromfile im Stapel auftritt, die ich hier auf Vollständigkeit kopieren :
/**
* A loader method that checks to see if a file exists for the given file name.
* If no file exists, it exits without error. If a file exists, it is loaded
* and fills the object with the contained data. WARNING: This method will overwrite
* all pre-existing and preset values, so make changes to the class only after
* invoking this method. Use the write() class method to write the data to a file.
* @param filename
*/
void Hospital::readFromFile(std::string filename) {
ifstream storedDataFile(filename.c_str());
if(storedDataFile){
storedDataFile >> this;
storedDataFile.close();
}
}
In dieser Situation ist "dies" ein Krankenhausobjekt.
Alle Hilfe und Ideen sind willkommen. Ich wiederhole mich selbst C++ und suche nach einem tieferen Verständnis der Sprache und ihrer Prozesse.
'this' ist ein * Zeiger auf * ein' Hospital' Objekt. –
Nehmen Sie den Namen durch const-Verweis und Sie können auch den Namen von "GetName" durch Const-Verweis zurückgeben, wenn es nur ein Klassenmitglied ist. 'operator << sollte Hospital durch const Referenz nehmen. –