[c++] Ausgabeoperator << überladen

radazong

Mitglied
Hello again ^^.
Ich habe eine Frage...undzwar habe ich mir eine Klasse LOGFILE geschrieben, die mit C-Dateioperationen eine Textdatei anlegt, und die gewünschten Log-Einträge in diese Datei schreibt.
Nun habe ich mir dazu eine Funktion :

Code:
      void LOGFILE::Write(const char* string)
      {
           sprintf(String,"%3d : ",Count);                                      
           strcat(String,string);                                               
           strcat(String,";\n");                                                
           fputs(String,File);                                                  
           ++Count;                                                             
      }

geschrieben, um in das LogBuch zu schreiben. Nun wollte ich es allerdings komfortabler für den Programmierer gestalten, und einfach den '<<' Ausgabeoperator überladen.

Nur leider habe ich mit Operatorüberladung nicht wirklich große Erfahrungen, und so sind alle Versuche dies zu verwirklichen bisher gescheitert.
- Als friend-Funktion hat es nicht geklappt,
- Als Memberfunktion mit '*this' als Rückgabewert wird der entsprechende Text zwar in Das Logbuch geschrieben, danach wird allerdings anscheinend der Destruktor des Objektes aufgerufen und das Logbuch damit geschlossen, sodass keine weiteren Schreiboperationen mehr möglich sind.
- Auch alle anderen verzeifelten Versuche wie z.B. die Funktion als void zu deklarieren, oder sonstiges waren bisher nicht von Erfolg gekrönt - kann mir dabei irgendjemand weiterhelfen?

LG, schönen abend :)
 
Bisher hat es bei mir mit friend immer geklappt. Probier mal:

C++:
// log.h - declaration
friend ostream& operator<< (ostream&,const LOGFILE&);

// log.cpp - definition
ostream& operator<< (ostream &o,const LOGFILE &L)
{
   // Code
   return o;
}

So sieht zumindest die Überladung aus wenn man ein Objekt (bzw. deren Daten) mittels >> ausgeben möchte. Das was du möchtest ist ja in eine Datei schreiben. Dafür gibt es den fstream mit ofstream und ifstream
 
Hallo!
Vielen Dank schonmal für die Antwort. Habe gleich mal eine Frage zu deiner Lösung:
Wieso wird die Funktion als Referenz deklariert? (Oder wird das anders ausgedrückt?)

Ja, mit ifstream und ofstream würde es sicherlich klappen. Nur möchte ich den Operator ja für meine eigene Klasse, die mit C - Dateioperationen, und nicht mit c++ Dateioperationen (wie fstream) arbeitet, überladen.

Gruß
 
EIN TRAUM

Nach mehrmaligem rumprobieren, habe ich die Funktion wie folgt verändert:

Code:
void operator<<(LOGFILE &test,const char* string)
//...
void operator<<(LOGFILE &test,const char* string)
      {
              test.Write(string);
      }

Das einzige was ich geändert habe ist, dass ich LOGFILE als Referenz übergebe.
Wenn mir jetzt vielleicht noch einmal irgendjemand erklären kann, warum der Destruktor des Objektes aufgerufen wird(der auch gleich die Datei schließt), wenn ich das Objekt nicht als Referenz übergebe?

Auf jeden Fall hat mich deine Antwort, lieber Online-Skater, auf den richtigen Weg geführt,
Danke nochmals :) .

Gruß

PS: Schließe den Thread in morgen Abend, damit mir darauf noch möglichst viele Leute eine Antwort geben können
 
Hi.
Wenn mir jetzt vielleicht noch einmal irgendjemand erklären kann, warum der Destruktor des Objektes aufgerufen wird(der auch gleich die Datei schließt), wenn ich das Objekt nicht als Referenz übergebe?
Wenn du das Objekt als Kopie (call-by-value) übergibst, wird ein neues LOGFILE Objekt erstellt (Konstruktor wird aufgerufen) und nach Beendigung der Funktion wieder weggeräumt (Destruktor wird aufgerufen).

Gruß
 
Zurück