Usando o Ostream como referência (C ++)
-
26-09-2019 - |
Pergunta
Eu tenho uma tarefa de casa em que o arquivo de cabeçalho é fornecido para nós e é imutável. Estou tendo problemas para descobrir como usar corretamente uma função "exibição", então aqui está o código relevante.
O arquivo de cabeçalho:
#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
Aqui está minha implementação da função "Display":
void Set::display( ostream& Out ) const
{
Node * temp = Head;
cout << "{ ";
while( temp != NULL )
{
cout << temp << ", ";
temp = temp->Succ;
return Out;
}
}
E aqui está meu motorista:
#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();
}
O erro que estou recebendo diz que, no meu driver, não estou usando os parâmetros corretos. Eu entendo isso porque o arquivo .h usa o Ostream e como um parâmetro. Minha pergunta é: o que eu uso no meu arquivo de driver ao chamar "Display" como um bom parâmetro?
Solução
Como você disse, o display
espera um parâmetro do tipo std::ostream &
.
Na sua implementação do método de exibição, você está emitindo std::cout
que desafia a lógica de receber o fluxo de saída como um parâmetro para o método. Aqui, o ponto do parâmetro é que o display
O chamador poderá fornecer o fluxo de saída de sua escolha. Se a escolha dele for a saída padrão, ele escreverá:
x.display(std::cout);
Isso significa que o seu display
A implementação deve ser produzida apenas no Out
parâmetro e não std::cout
.
Observe também que:
- Sua
display
A implementação retorna um valor, o que não deveria (void
tipo de retorno) - Eu uso o
std::
prefixo na minha resposta para clareza, mas eles não são necessários no seu caso, pois o arquivo de cabeçalho contém umusing namespace std;
.
Outras dicas
O que você precisa fazer é substituir todos os lugares que você usou. Passe também o cout como um parâmetro como x.display (cout). Isso ocorre porque o Cout está fora do tipo Ostream e toda essa inicialização é feita no iostream.
No seu método de exibição, você está usando explicitamente Cout. Mas este é o "padrão fora". O método deve preferir usar. Portanto, em exibição (), apenas substitua todas as ocorrências de cout sem.
Em seguida, use o display (cout); em sua chamada
Você não está passando em um objeto de ostream. Mude para isso:
X.display(cout);
Então, em sua classe, substitua todas as ocorrências de cout sem. Além disso, a função de exibição deve retornar um const Ostream e em vez de void. Você também deve usar referências const Ostream em vez de Ostream.
É padrão usar um operador fora da classe:
const ostream & operator<< (const ostream & Out, const Set & set)
{
// display your Set here using out, not cout
return out;
}
Dessa forma, você pode fazer coisas como:
cout << "This is my set: " << mySet << endl;