Utilizzo di ostream come riferimento (C++)
-
26-09-2019 - |
Domanda
Ho un compito a casa in cui ci viene fornito il file di intestazione ed è immutabile.Ho difficoltà a capire come utilizzare correttamente una funzione di "visualizzazione", quindi ecco il codice pertinente.
Il file di intestazione:
#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
Ecco la mia implementazione della funzione "display":
void Set::display( ostream& Out ) const
{
Node * temp = Head;
cout << "{ ";
while( temp != NULL )
{
cout << temp << ", ";
temp = temp->Succ;
return Out;
}
}
Ed ecco il mio autista:
#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();
}
L'errore che ricevo dice che nel mio driver non sto utilizzando i parametri corretti.Lo capisco perché il file .h utilizza ostream& come parametro.La mia domanda è: cosa devo utilizzare nel mio file del driver quando chiamo "display" come parametro valido?
Soluzione
Come hai detto, il display
si aspetta un parametro di tipo std::ostream &
.
Nell'implementazione metodo di visualizzazione, si sta stampando su std::cout
che sfida la logica di ricevere il flusso di output come parametro al metodo. Qui, il punto del parametro è che il chiamante display
sarà in grado di fornire il flusso di uscita di sua scelta. Se la sua scelta sembra essere lo standard output, scriverà:
x.display(std::cout);
Questo significa che l'implementazione display
dovrebbe emesso solo nel parametro Out
e non std::cout
.
Si noti inoltre che:
- L'implementazione
display
restituisce un valore, che non dovrebbe (void
tipo di ritorno) - Io uso il prefisso
std::
nella mia risposta per chiarezza, ma non sono necessari nel vostro caso come il file di intestazione contiene unusing namespace std;
.
Altri suggerimenti
Quello che dovete fare è sostituito per tutti i luoghi che avete usato cout. Anche passare cout come parametro come x.display (cout). Questo perché, cout è spento tipo ostream e tutto questo l'inizializzazione è fatto in iostream.
Nel tuo metodo di visualizzazione, stai utilizzando esplicitamente cout.Ma questo è lo "standard out".Il metodo dovrebbe piuttosto utilizzare Out.Quindi in display(), sostituisci semplicemente ogni occorrenza di cout con Out.
Quindi utilizzare display( cout );nella tua chiamata
Non si passa in un oggetto ostream. Cambiarlo in questo modo:
X.display(cout);
Poi, nella tua classe sostituire tutte le occorrenze di cout con Out. Inoltre, la funzione di visualizzazione dovrebbe restituire un ostream const & anziché vuoto. Si dovrebbe anche essere utilizzando i riferimenti const ostream invece di ostream.
È standard di utilizzare un esterno operatore della classe:
const ostream & operator<< (const ostream & Out, const Set & set)
{
// display your Set here using out, not cout
return out;
}
In questo modo si possono fare cose come:
cout << "This is my set: " << mySet << endl;