2010-11-18 15 views
11

Tengo una tarea asignada en la que se nos proporciona el archivo de encabezado y no se puede cambiar. Tengo problemas para descubrir cómo usar correctamente una función de "visualización", así que aquí está el código relevante.Uso de ostream como referencia (C++)

El archivo de cabecera:

#ifndef SET_ 
#define SET_ 

typedef int EType; 

using namespace std; 

#include <iostream> 

class Set 
{ 
    private: 

    struct Node 
    { 
     EType Item;  // User data item 
     Node * Succ; // Link to the node's successor 
    }; 

    unsigned Num;  // Number of user data items in the set 
    Node * Head;  // Link to the head of the chain 

    public: 

    // Various functions performed on the set 

    // Display the contents of the set 
    // 
    void display(ostream&) const; 

}; 

#endif 

Aquí está mi implementación de la función "pantalla":

void Set::display(ostream& Out) const 
{ 
    Node * temp = Head; 
    cout << "{ "; 
    while(temp != NULL) 
    { 
    cout << temp << ", "; 
    temp = temp->Succ; 
    return Out; 
    } 
} 

Y aquí es mi conductor:

#include <iostream> 
#include <iomanip> 
#include "/user/cse232/Projects/project08.set.h" 

using namespace std; 

int main() 
{ 
    Set X; 
    X.insert(10); 
    X.insert(20); 
    X.insert(30); 
    X.insert(40); 
    X.display(); 
} 

El error Soy recibir dice que en mi controlador, no estoy usando los parámetros correctos. Entiendo esto porque el archivo .h usa ostream & como parámetro. Mi pregunta es, ¿qué uso en mi archivo de controlador cuando llamo a "mostrar" como un buen parámetro?

+2

Esa es una pregunta novato en muy buena forma. Se eliminaron todos los bits irrelevantes, pero (casi) se muestran todos los bits relevantes. La próxima vez, simplemente agregue el mensaje de error exacto e indique la línea exacta a la que apunta, y sería perfecto. – sbi

+1

¡Lo haré, gracias! – user212562

Respuesta

11

Como dijo, el display espera un parámetro del tipo std::ostream &.

En su implementación del método de visualización, está produciendo en std::cout, lo que desafía la lógica de recibir el flujo de salida como un parámetro para el método. Aquí, el punto del parámetro es que el llamador display podrá proporcionar la secuencia de salida de su elección. Si su elección pasa a ser la salida estándar, escribirá:

x.display(std::cout); 

Esto significa que su aplicación sólo debe display de salida en el parámetro Out y no std::cout.

También tenga en cuenta que:

  • Su aplicación display devuelve un valor, que no debería (tipo void retorno)
  • que utilizar el prefijo std:: en mi respuesta para mayor claridad, pero no son obligatorios en su caso, ya que el archivo de encabezado contiene un using namespace std;.
+0

Oh, gracias por la explicación. Cambié mi archivo de implementación para que en lugar de usar cout << blahblah, use Out << blahblah. También eliminé el "return Out"; línea y usé std :: cout como parámetro, ¡y el programa finalmente compilado y me dio salida! La salida es direcciones, pero esa es una solución fácil, creo. ¡Gracias por tu ayuda! :) – user212562

+0

1 - usando el parámetro de este tipo es preferible ya que esto permite que su clase para apoyar la salida de flujo de salida estándar cualquier otro C++, (por ejemplo ostringstream, ofstream) sin modificaciones –

0

Lo que tienes que hacer es sustituir todos los lugares que has usado cout. También pase cout como un parámetro como x.display (cout). Esto es porque, cout está apagado, escribe ostream y toda esta inicialización se hace en iostream.

0

En su método de visualización, está utilizando explícitamente cout. Pero este es el "estándar". El método debería usar Out. Entonces, en display(), simplemente reemplaza cada aparición de cout con Out.

Luego use display (cout); en su llamada

0

No está pasando un objeto ostream. Cámbielo a esto:

X.display(cout); 

En su clase, reemplace todas las apariciones de cout con Out. Además, la función de visualización debe devolver un contraste & en lugar de vacío. También debería usar referencias de const ostream en lugar de ostream.

Es estándar para usar un operador fuera de la clase:

const ostream & operator<< (const ostream & Out, const Set & set) 
{ 
    // display your Set here using out, not cout 
    return out; 
} 

De esta manera usted puede hacer cosas como:

cout << "This is my set: " << mySet << endl; 
+0

no creo que tendría un problema de escritura de esa manera. Siento que muchos de mis proyectos sería más fácil si pudiera escribir mis propios archivos de cabecera, pero mi profesor de ellas incluye las asignaciones del proyecto, por lo que no tienen más remedio que hacerlo a la inversa. :(Sin embargo, la parte acerca del uso de salida en lugar de cout era algo que no había pensado, así que gracias por la respuesta – user212562

+0

FYI: El código anterior no se compila con cualquier compiladores en mi sistema (Linux: gcc o ICC) una vez que comience realmente tratando de escribir en el ostream. la aplicación de gcc ostream no proporciona versiones "const" de '' << operador de tipos básicos, por lo que es necesario utilizar un objeto ostream y no constante. –

Cuestiones relacionadas