2012-04-09 11 views
9

Se cout è un oggetto di classe ostream, allora perché non possiamo dichiarare il nostro oggetto, diciamo, "fuori" dalla stessa classe. non è il seguente codice che dovrebbe funzionare ??perché non possiamo creare il nostro oggetto ostream

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

o in altro modo

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

Cosa farebbe? Dove andrà l'uscita? –

+3

Cosa si suppone che sia "ostream_withassign"? – jrok

+0

perché pensi che non sia possibile fare? –

risposta

0

Non hai impostato l'oggetto ostream (quello che fa questa uscita stream), ovviamente non si può usarlo. http://www.cplusplus.com/reference/iostream/ostream/ostream/
cioè

// 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

Come possiamo fare questo codice per inviare output allo standard output proprio come fa cout? – user1232138

+0

@user - Non possiamo senza utilizzare alcune conoscenze specifiche del sistema operativo. Ecco perché abbiamo già 'cout' nella libreria standard. –

+1

@ user1232138 Si potrebbe derivare da 'ostream' e passare' cout's 'rdbuf()' come parametro costruttore di ostream. Non sono sicuro che sia una buona idea, comunque. – jrok

5

oggetti Stream richiedono un buffer per inviare dati al dispositivo esterno. L'oggetto standard del flusso di output, std::cout, è inizializzato con un buffer che incapsula il trasporto ovunque appaia l'output. Ecco un esempio inventato:

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

Per rendere il proprio oggetto flusso che finge di essere l'oggetto stream standard, si può semplicemente passare il buffer di std::cout al suo costruttore. Si noti che non consiglierei di fare questo in pratica:

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

copy << "Hello World"; 
0

ostream classe è derivata da ios classe. Il costruttore della classe ios ha il seguente aspetto.

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

Il che significa costruttore di default di iOS è protetto e quindi non è possibile creare l'oggetto utilizzando il costruttore predefinito di ostream.

L'unico modo per creare l'oggetto di ostream è l'uso di streambuf sb *.

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

Analogamente, non è possibile passare gli oggetti ostream per valore.

Motivo

ios è derivato da ios_base. Il suo costruttore di copie è privato.

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