2015-09-07 11 views
5

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.

+0

'this' ist ein * Zeiger auf * ein' Hospital' Objekt. –

+0

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. –

Antwort

8

Sie werden verwenden:

storedDataFile >> *this; 
       // ~~ dereference the `this` pointer (i.e. Hostipal Object) 
       /* Enabling the match for operator>>(istream &is, Hospital &hospital) */ 
+0

Brilliant! Ich habe komplett vergessen, dass der '->' Operator dies automatisch demeferenziert, also muss ich ohne es manuell deneferenzieren! Ich danke dir sehr! Ich habe ein Zeitlimit, bevor ich Ihre Antwort annehmen kann. Ich werde zurückkehren, nachdem das Limit abgelaufen ist, um Ihnen die Punkte zu geben. Danke nochmal! –