[C++] Eigene Stream-Klasse

jccTeq

Erfahrenes Mitglied
Hallo Leute,

ich hab gerade ein Blackout... ich möchte eine meiner Klassen darauf umbauen, daß ich Daten an sie wie an einen Stream übergeben kann. Also in folgemdem Stil:

Code:
MyClass xyz;

xyz << "Hallo Welt" << std::endl;

Die Klasse hat jetz bereits eine Funktion, die ähnlich printf funktioniert:

Code:
int abcd = 14;
MyClass xyz;

xyz.MonPrint("Blablubb %i\n", abcd);

Dies möchte ich wie gesagt jetzt als Stream machen können. Wie macht man das?
 
Hi.

Du mußt dir nur einen solchen Stream Operator für deine Klasse erstellen:
C++:
class MyClass {
  ...
public:
  MyClass& operator<< (const string& str) {
    MonPrint(str);
  }
};
Du könntest auch analog zu den Stream Klassen einen friend operator erstellen. Das sei dir mal als Übung überlassen. (Tipp: Google)

Gruß
 
Das mit den friend Dingern scheint genau falschherum zu sein. Ich will nicht Teile meiner Klasse über << ausgeben lassen, sondern meiner Klasse die Formatierung und Ausgabe von Werten überlassen, die über << hereinkommen:

Code:
MyClass xyz;
std::string sTest = Hallo;

xyz << sTest << std::endl;

Ausgabe:
Code:
bash# ./myClassTest
MyClass Ausgabe: Hallo

bash#

Sowas meinte ich...
 
Weiter geht's... da ich eine weitere Klasse habe, die etwas in diese Klasse ausgeben können soll, brauche ich ja eine Verbindung zwischen den Klassen. Also MyOtherClass muss MyClass kennen. Da dies aber nicht der Fall ist (und werden kann, da MyOtherClass dynamisch als Plugin mit dlopen etc. hereingeladen wird), ich aber von MyClass nur die Stream Funktionalität hier benötige, bräuchte ich da 'nen Denkanstoß... Ableiten von std::ostream?
 
(irgendwie bin ich immer noch nicht ganz wach...)

Also normalerweise definiert man ja für Plugins eine Schnittstelle die diese dann verwenden können. Warum sollte dann also das Plugin die Stream-Klasse nicht kennen?

Gruß
 
Korrekt. Nur müsste ich für die Einbindung meiner eigenen Streamklasse in die Plugins eine ganze Reihe von Abhängigkeiten mit einbinden. Das will ich vermeiden. Okay, eine Lösung wäre es, eine Klasse zu schreiben, die nur die Ausgaben macht. Also den eingehenden Stream puffert und bei Bedarf (endl, EOF etc.) an die MonPrint Funktion meiner großen Klasse übergibt. Das wäre 'ne Möglichkeit...
 
& bezeichnet eine Referenz auf ein Objekt. Dazu findest du näheres in einer guten C++ Dokumentation. Stichwort "Referenzen".
 
Zurück