2011-04-01 34 views
5

Estoy trabajando en un proyecto de tarea para un rolodex virtual que ha requerido una clase principal, una clase de rolodex y una clase de tarjeta. Para enviar los contenidos de todas las "tarjetas" a la consola, la tarea dice que main() debe llamar a una función show (...) en la clase rolodex, pasándola un ostream y show (...) luego itera sobre las tarjetas, llamando a cada una de sus funciones showCard(). La muestra real se realiza mediante la función showCard() de los objetos de la tarjeta, que se muestra en el ostream proporcionado.C++ Pasando ostream como parámetro

Lo que no entiendo es por qué un ostream debería/debería pasarse a otra parte. Parece que la asignación está llamando a algo como esto:

main() { 
    Rolodex myRolodex; 
    ostream myStream; 
    myRolodex.show(myStream); 
} 

void Rolodex::show(ostream& theStream) { 
    //for each card 'i' in the Rolodex... 
    myCard[i].show(theStream); 
} 

void Card::show(ostream& theStream) { 
    theStream << "output some stuff" << endl; 
} 

en lugar de algo como esto:

main() { 
    Rolodex myRolodex; 
    myRolodex.show(); //no ostream passed 
} 

void Rolodex::show() { 
    //for each card 'i' in the Rolodex... 
    myCard[i].show();//no ostream passed 
} 

void Card::show() { 
    cout << "output some stuff" << endl; 
} 

Soy yo sea mala interpretación del uso de ostream como un parámetro o falta alguna otra razón obvia para pasar un ostream en la corriente de esa manera?

+0

Para que todos sean iguales, la segunda línea en 'main' necesita desaparecer, y la tercera línea debe ser' myRolodex.show (std :: cout); '. –

+0

Editado para eliminar el objeto ostream en el segundo ejemplo, pero ¿por qué std :: cout aún debe transmitirse a Card :: show()? ¿No puede simplemente usar cout? ¿O tal vez por el mismo te refieres a que ambas versiones pasan un ostream (no solo la misma salida)? – ChrisM

+0

'std :: cout' es un objeto' ostream'. La idea de pasar un 'std :: ostream' es hacerlo de modo que a la función no le importe dónde está enviando el resultado. 'std :: cout' es solo una instancia especial de' std :: ostream'. Si haces que la función use esa instancia de 'std :: ostream', has derrotado el punto del parámetro. –

Respuesta

9

Lo que no entiendo es por qué un ostream debería o debería pasar en cualquier lugar.

Esto a menudo se usa para cosas como pruebas. Supongamos que quiere la salida de la consola normalmente, por lo que debe pasar una referencia al std::cout. Pero a veces quieres hacer pruebas, p. prueba de unidad o aceptación, y desea almacenar la salida en la memoria para eso. Puede usar std::stringstream para esto, y la función con la que está trabajando no es la más acertada.

Ese es un caso específico, pero en general, cualquier lugar en el que desee cambiar el origen o la fuente de datos de donde proceden los datos, puede hacerlo pasando una secuencia.

Por ejemplo, la siguiente sería imprimir su tarjetero en la consola:

int main() 
{ 
    Rolodex myRolodex; 
    myRolodex.show(std::cout); 
} 

... pero si mañana que quería escribir en un archivo en su lugar, se puede hacer eso sin afectar el código dentro de Rolodex en todo:

int main() 
{ 
    Rolodex myRolodex; 
    std::ofstream file("This\\Is\\The\\Path\\To\\The\\File.txt"); 
    myRolodex.show(file); // Outputs the result to the file, 
          // rather than to the console. 
} 
2

me acaba de sobrecargar el operador <<:

class Card{ 
public: 
    friend ostream& operator<<(ostream& os, const Card& s); 
}; 

ostream& operator<<(ostream& os, const Card& s){ 
    os << "Print stuff"; 
    return os; 
} 

Y también podría sobrecargar en el Rolodex para repetir las tarjetas.

Cuestiones relacionadas