2012-04-09 13 views
9

Si cout es un objeto de la clase ostream, entonces ¿por qué no podemos declarar nuestro propio objeto, por ejemplo, 'salir' de la misma clase. es decir, ¿no se supone que el siguiente código funciona?por qué no podemos crear nuestro propio objeto ostream

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

o de otra manera

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

¿Qué haría? ¿A dónde iría la salida? –

+3

¿Qué se supone que 'ostream_withassign' es? – jrok

+0

¿Por qué crees que no es posible hacerlo? –

Respuesta

0

no configuró el objeto ostream (lo que hace este flujo de salida a), por supuesto que no se puede utilizar. http://www.cplusplus.com/reference/iostream/ostream/ostream/
es decir

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

¿Cómo podemos hacer que este código envíe la salida a la salida estándar como lo hace cout? – user1232138

+0

@user: no podemos hacerlo sin utilizar algunos conocimientos específicos del sistema operativo. Es por eso que ya tenemos 'cout' en la biblioteca estándar. –

+1

@ user1232138 Puedes derivar de 'ostream' y pasar' cout's 'rdbuf()' como el parámetro constructor de ostream. Aunque no estoy seguro de si es una buena idea. – jrok

5

Los objetos de flujo requieren un tampón para enviar datos al dispositivo externo. El objeto de flujo de salida estándar, std::cout, se inicializa con un búfer que los encapsula transportan a donde aparezca su salida. Aquí está un ejemplo artificial:

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

Para hacer su propio objeto de secuencia que pretende ser el objeto de secuencia estándar, usted puede simplemente pasar el búfer de std::cout a su constructor. Nótese que no recomendaría hacer esto en la práctica:

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

copy << "Hello World"; 
0

ostream clase se deriva de ios clase. El constructor de la clase ios se ve a continuación.

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

Lo que significa constructor por defecto de iOS está protegido y por lo tanto no se puede crear el objeto utilizando constructor por defecto de ostream.

El único camino que queda para crear el objeto de ostream es usando streambuf sb * argument.

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

De forma similar, no puede pasar objetos ostream por valor.

Motivo

ios se deriva de ios_base. Su constructor de copia es privado.

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