Opertatoren << und >> überladen, damit man speichern kann



  • Hallo!

    Ich muss in einem Programm das Speichern und Laden integrieren. Die Vorgabe ist, dass es mit der Überladung von Operatoren funktionieren muss. Dabei soll das Speichern in der Datei mit dem fstream erfolgen, wobei hier nur noch das Objekt in das File geschrieben werden soll.

    Nun ich habe jetzt schon viel im Internet gefunden, aber noch nichts das mir auch wirklich geholfen hätte.

    Soweit ich das Konzept verstanden haben sollte das folgendermaßen funktionieren:

    - In meinem header file habe ich den Operator mittels friend eingebaut (ostream)

    friend std::ostream &operator << (std::ostream&, const MyClass);
    

    - Nötigen include Dateien wurden implementiert
    - In der cpp Datei implemntiere ich dann Nochmals den Operator so:

    std::ostream &operator << (std::ostream &os, const MyClass &mc)
    {
      mc.toStream(os);
      return os;
    }
    

    - Das toStream wird ebenfalls noch implementiert und enthält, jene Variablen die ich speichern möchte. (alle membervariablen sind private, da bekomme ich auch immer Fehlermeldungen)

    - Dann hätte ich noch ein Objekt der Klass erstellt mit

    MyKlasse *myclass = new MyKlasse();
    

    und dieses Objekt mit dem Filestream in ein File geschrieben, aber das hat nicht funktioniert.

    Kann mir jemand helfen? bzw. einen Link zu einem Tutorial zeigen, wo ich sehe und verstehen kann wie das ganze funktionieren soll bzw. was ich falsch gemacht habe.

    lg user00009



  • Für mich sieht das soweit richtig aus. Das Einzige was ich mir vorstellen kann, was du evtl falsch gemacht hast, ist dass du vergessen haben könntest, die Klassen-Instanz zu dereferenzieren.

    MyKlasse *myclass = new MyKlasse();
    ofstream file( .. );
    file << myclass; // Schreibt den Zeiger rein
    file << *myclass; // Ruft deinen überladenen Operator auf.
    

    Wenn's daran nicht liegt, musst du ein wenig spezifizieren, was denn nicht geht (Compilerfehler, Laufzeitfehler, ...) und ein bissl Quelltext zeigen.

    PS: Wieso hast du die "operator<<"-Funktion eigentlich als "friend" markiert?



  • Das Problem ist das der Compiler immer einen Fehler schreibt, wenn ich
    bei toStream.

    void MyKlasse::toStream(ostream &os) const
    {
    	os << member1;
    	os << member2;
    }
    

    member1 und member2 sind private integer Variablen. Beim Kompilieren bekomme ich dann immer eine Fehlermeldung, dass er auf private Variablen nicht zugreifen kann, obwohl diese in der selben Klasse sind.



  • user00009 schrieb:

    ...Beim Kompilieren bekomme ich dann immer eine Fehlermeldung, dass er auf private Variablen nicht zugreifen kann, obwohl diese in der selben Klasse sind.

    Das glaube ich nicht. 😉
    Hast Du vielleicht "toStream()" nicht public gemacht ?

    BTW: Ich würde toStream() direkt ostream& zurückliefern lassen.

    ostream& MyKlasse::toStream(ostream &os) const { return os << member << member2; }
    
    ostream &operator<<(ostream &os, const MyClass &mc) { return mc.toStream(os); }
    

    spart ein wenig Tipparbeit...

    Gruß,

    Simon2.



  • Simon2 schrieb:

    user00009 schrieb:

    ...Beim Kompilieren bekomme ich dann immer eine Fehlermeldung, dass er auf private Variablen nicht zugreifen kann, obwohl diese in der selben Klasse sind.

    Das glaube ich nicht. 😉
    Hast Du vielleicht "toStream()" nicht public gemacht ?

    War ein anderer Zugriffsfehler. Das funkt jetzt

    Dafür bekomme ich jetzt bei der toStream Methode folgenden Fehler:

    1>d:\MyClass.cpp(591) : error C2511: 'std::ostream &MyClass_::toStream(std::ostream &) const': Überladene Memberfunktion nicht in 'MyClass' gefunden.

    Die ist aber in MyClass drinnen im cpp und im h file.

    BTW: Ich würde toStream() direkt ostream& zurückliefern lassen.

    ostream& MyKlasse::toStream(ostream &os) const { return os << member << member2; }
    

    An was kanns liegen?

    lg user00009



  • Hast du die Funktion in der cpp-Datei als const deklariert und in der Header-Datei nicht?



  • Im Header-File übergibst du eine Instanz, in der Implementierung aber eine Referenz von MyClass.


Anmelden zum Antworten