2012-04-09 4 views
9

erstellen Wenn cout ein Objekt von Ostream Klasse ist, warum dann können wir unser eigenes Objekt nicht erklären, sagen, ‚out‘ aus der gleichen Klasse. d. h. soll der folgende Code nicht funktionieren?warum nicht können wir unser eigenes ostream Objekt

#include<iostream> 
using namespace std; 
int main() 
{ 
    ostream out; 
    out<<"something"; 
} 

oder sonst

#include<iostream> 
using namespace std; 
int main() 
{ 
    ostream_withassign out; 
    out<<"something"; 
} 
+1

Was würde es tun? Wohin würde der Output gehen? –

+3

Was soll 'ostream_withassign' sein? – jrok

+0

Warum denkst du, dass es nicht möglich ist? –

Antwort

0

Sie setzen nicht die ostream Objekt (was macht diesen Strom Ausgang), natürlich können Sie es nicht verwenden können. http://www.cplusplus.com/reference/iostream/ostream/ostream/
d.h.

// ostream constructor 
#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    filebuf fb; 
    fb.open ("test.txt",ios::out); 
    ostream os(&fb); 
    os << "Test sentence\n"; 
    fb.close(); 
    return 0; 
} 
+0

Wie können wir diesen Code machen, um Ausgabe an die Standardausgabe zu senden, genau wie Cout? – user1232138

+0

@user - Wir können nicht ohne einige Betriebssystemspezifische Kenntnisse verwenden. Deshalb haben wir schon in der Standard-Bibliothek "cout". –

+1

@ user1232138 Sie könnten von 'ostream' ableiten und 'cout's 'rdbuf()' als ostreams Konstruktorparameter übergeben. Ich bin mir nicht sicher, ob das eine gute Idee ist. – jrok

5

Stromobjekte erfordern eine Pufferdaten an das externe Gerät zu senden. Das Standardausgabe-Stream-Objekt, std::cout wird mit einem Transportpuffer der Verkapselungen initialisiert, wo die Ausgabe erscheint. Hier ist ein konstruiertes Beispiel:

std::ostream cout(/* buffer */); 

Um Ihr eigenes Stream-Objekt zu machen, dass das Standard-Stream-Objekt zu sein vorgibt, können Sie einfach den Puffer von std::cout an den Konstruktor übergeben. Beachten Sie, dass würde ich tun dies in der Praxis nicht empfehlen:

std::ostream copy(std::cout.rdbuf()); // Note: not a *real* copy 

copy << "Hello World"; 
0

Ostream Klasse von ios Klasse abgeleitet ist. Konstruktor der ios-Klasse sieht wie folgt aus.

public: explicit ios (streambuf* sb); 
protected: ios(); 

Welche Standardkonstruktors von ios Mittel geschützt und daher können Sie nicht Objekt mit Standard-Konstruktor von Ostream erstellen.

Nur möglich, um Objekt von Ostream zu erstellen, ist streambuf sb * Argument.

std::ostream my_obj(std::cout.rdbuf()); 

In ähnlicher Weise können Ostream-Objekte nicht nach Wert übergeben werden.

Reason

ios aus ios_base abgeleitet. Der Kopierkonstruktor ist privat.

protected: ios_base();  
private: ios_base (const ios_base&);