2010-11-18 10 views
11

Mam zadanie domowe, do którego dostarczono plik nagłówkowy, i jest ono niezmienne. Mam problem z ustaleniem, jak poprawnie korzystać z funkcji "wyświetlania", więc tutaj jest odpowiedni kod.Używanie ostream jako odniesienia (C++)

Plik nagłówka:

#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 

Oto moja implementacja funkcji "display":

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

A oto mój kierowca:

#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(); 
} 

Błąd jestem Odbiór mówi, że w moim sterowniku nie używam poprawnych parametrów. Rozumiem, ponieważ plik .h używa ostream & jako parametru. Moje pytanie brzmi, co mam użyć w moim pliku sterownika, gdy wywołanie "display" jest dobrym parametrem?

+2

To pytanie newbie w dość dobrym stanie. Wszystkie nieistotne bity usunięte, ale (prawie) wszystkie pokazane odpowiednie bity. Następnym razem wystarczy dodać dokładny komunikat o błędzie i wskazać dokładną linię, na którą wskazuje, i będzie idealnie. – sbi

+1

Zrobię to, dzięki! – user212562

Odpowiedz

11

Tak jak powiedziałeś, display oczekuje parametru o typie std::ostream &.

W implementacji metody wyświetlania wyprowadzane jest w postaci std::cout, która wymusza logikę odbioru strumienia wyjściowego jako parametru metody. Tutaj punktem parametru jest to, że wywołujący display będzie mógł podać strumień wyjściowy swojego wyboru. Jeśli jego wybór okazuje się być standardowe wyjście, będzie napisać:

x.display(std::cout); 

Oznacza to, że realizacja powinna tylko wyjście w parametrze Out i nie std::coutdisplay.

Należy również pamiętać, że:

  • Implementacja display zwraca wartość, która nie powinna (typ void powrót)
  • używam prefiks std:: w moją odpowiedź dla jasności, ale nie są one wymagane w twoim przypadku plik nagłówkowy zawiera using namespace std;.
+0

Oh, dzięki za wyjaśnienie. Zmieniłem plik implementacyjny tak, że zamiast używać cout << blahblah, używa Out << blahblah. Usunąłem także "powrót na zewnątrz"; line i użył std :: cout jako parametru, a program w końcu skompilował i dał mi wynik! Dane wyjściowe są adresami, ale myślę, że to łatwa łatka. Dziękuję za pomoc! :) – user212562

+0

+1 - użycie tego parametru jest lepsze, ponieważ pozwala klasie obsługiwać wyjścia do dowolnego standardowego strumienia wyjściowego C++ (np. Ostringstream, ofstream) bez modyfikacji –

0

Co trzeba zrobić, to zastąpić wszystkie miejsca, w których używano cout. Przekaż także cout jako parametr, taki jak x.display (cout). Dzieje się tak, ponieważ cout jest wyłączonym ostream i cała ta inicjalizacja jest wykonywana w iostream.

0

W swojej metodzie wyświetlania jawnie używasz cout. Ale to jest "standardowe wyjście". Metoda powinna raczej używać Out. Więc w display(), po prostu zamień każde wystąpienie cout na Out.

Następnie użyj wyświetlacza (cout); w swoim połączeniu

0

Nie przekazujesz obiektu ostream. Zmień to na:

X.display(cout); 

Następnie w swojej klasie wymień wszystkie wystąpienia cout na Out. Ponadto, funkcja wyświetlania powinna zwrócić const ostle & zamiast pustej. Powinieneś także używać referencji const ostream zamiast ostream.

Jest to standardowy użyć operatora poza klasą:

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

W ten sposób można zrobić rzeczy jak:

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

Nie sądzę, bym miał problem z pisaniem to w ten sposób. Mam wrażenie, że wiele moich projektów byłoby łatwiejszych, gdybym mógł napisać własne pliki nagłówkowe, ale mój profesor włącza je do zadań projektowych, więc nie mam wyboru, ale zrobić to w inny sposób. :(Jednak część dotycząca używania Out zamiast couta była czymś, o czym nie pomyślałem, więc dziękuję za odpowiedź! – user212562

+0

FYI: Powyższy kod nie kompiluje się z żadnymi kompilatorami w moim systemie (Linux: gcc lub icc), gdy zaczniesz próbować pisać do ostreama. Implementacja gcc ostreama nie dostarcza "stałych" wersji 'operatora <<' dla podstawowych typów, więc musisz użyć nie-const ostream & object. –

Powiązane problemy