Forum: PC-Programmierung C++ std::ostream in Klasse speichern


von W.B. (Gast)


Lesenswert?

Hallo.

Ich möchte gerne eine Referenz auf einen std::ostream als Klassenmember 
speichern. Zusätzlich sollte es eine statische Klasse sein.

Der Code sieht in etwa so aus:
1
class Test {
2
   static void SetStream(std::ostream& s);
3
private:
4
   static std::ostream& os;
5
};
6
7
std::ostream& Test::os = std::cout;    // initialisierung
8
9
void Test::SetStream(std::ostream& s) {
10
   os = s;                             // funktioniert nicht
11
}

Ich habe schon mehrere Möglichkeiten durchprobiert, leider kann ich es 
nicht kompillieren.

Im Endeffekt möchte ich eine statische Log-Klasse realisieren, wobei ich 
die Logs auf einen übergeben Stream ausgeben kann.


Hat jemand eine Ahnung, wie man das Problem lösen kann?

von Karl H. (kbuchegg)


Lesenswert?

W.B. schrieb:

> void Test::SetStream(std::ostream& s) {
>    os = s;                             // funktioniert nicht

Natürlich nicht.
Wenn eine Referenz einmal gesetzt ist, dann ist sie gesetzt. Man kann 
eine Referenz später nicht mehr auf ein anderes Objekt 'umbiegen'.

Referenzen bekommen in der Initialisierung 'gesagt', für welches andere 
Objekt sie stehen.
Alle weiteren Verwendungen dieser Referenz, die dann nur mehr 
Zuweisungen sein können (keine Initialisierungen) beziehen sich dann 
nicht mehr auf das Referenzobjekt sondern auf das referenzierte Objekt.

> Hat jemand eine Ahnung, wie man das Problem lösen kann?

Entweder einen Pointer halten oder einen Konstruktur machen, der die 
Referenz übernimmt und initialisiert und dann nach Bedarf jeweils ein 
neues Log-Objekt erzeugen.


Und die Unterscheidung von Initialisierung und Zuweisung beachten!
Das sind in C++ 2 grundverschiedene Dinge, die man auseinanderhalten 
muss.

   int i = 5;

und

   int i;
   i = 5;

sind nicht dasselbe! Das erste ist eine Initalisierung, das zweite eine 
Zuweisung. Im Falle eines int ist das egal. Aber im Falle von echten 
Objekten ist es das nicht. Initalisierung ist immer ein Teil einer 
Objektkonstruktion. Da wird also ein Konstruktor aufgerufen. Bei einer 
Zuweisung wird aber der operator= aufgerufen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.