2010-11-18 7 views
11

Ich habe eine Hausaufgabe, wo die Header-Datei uns zur Verfügung gestellt wird, und ist unveränderbar. Ich habe Probleme herauszufinden, wie man eine "Display" -Funktion korrekt verwendet, also hier ist der entsprechende Code.Verwendung von Ostream als Referenz (C++)

Die Header-Datei:

#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 

Hier ist meine Implementierung der Funktion "Anzeige":

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

Und hier ist mein Fahrer:

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

Der Fehler Ich bin Empfangen sagt, dass ich in meinem Treiber nicht die richtigen Parameter verwende. Ich verstehe das, weil die .h-Datei Ostream & als Parameter verwendet. Meine Frage ist, was verwende ich in meiner Treiberdatei, wenn "display" als ein guter Parameter aufgerufen wird?

+2

, die in ziemlich guter Form ein Neuling Frage ist. Alle irrelevanten Bits entfernt, aber (fast) alle relevanten Bits angezeigt. Nächstes Mal fügen Sie einfach die genaue Fehlermeldung hinzu und geben Sie die genaue Linie an, auf die es zeigt, und es wäre perfekt. – sbi

+1

Ich werde das tun, danke! – user212562

Antwort

11

Wie Sie gesagt haben, erwartet die display einen Parameter vom Typ std::ostream &.

In Ihrer Implementierung der Anzeigemethode geben Sie in std::cout aus, was die Logik des Empfangs des Ausgabestroms als Parameter für die Methode ausschließt. Hier besteht der Punkt des Parameters darin, dass der Aufrufer display den Ausgabestrom seiner Wahl bereitstellen kann. Wenn seine Wahl die Standardausgabe sein geschieht, wird er schreiben:

x.display(std::cout); 

Dies bedeutet, dass Ihre display Umsetzung sollte nur dann ausgegeben, in dem Out Parameter und nicht std::cout.

Beachten Sie auch, dass:

  • Ihre display Implementierung einen Wert zurückgibt, die es sollte nicht (void Rückgabetyp)
  • ich den std:: Präfix in meiner Antwort für Klarheit verwenden, aber sie sind nicht erforderlich in Ihrem Fall als die Header-Datei enthält eine using namespace std;.
+0

Oh, danke für die Erklärung. Ich änderte meine Implementationsdatei, so dass anstelle von cout << blahblah verwendet Out << blahblah. Ich entfernte auch die "Rückkehr"; Linie und verwendet std :: cout als Parameter, und das Programm schließlich kompiliert und gab mir die Ausgabe! Die Ausgabe ist Adressen, aber das ist eine einfache Lösung, denke ich. Danke für Ihre Hilfe! :) – user212562

+0

+1 - mit den Parameter wie folgt ist vorzuziehen, da dies Ihre Klasse erlaubt, die Ausgabe zu jedem anderen C++ - Standard-Ausgangsstrom (zB ostringstream, ofstream) ohne Änderung –

0

Was Sie tun müssen, ist Ersatz für alle Orte, die Sie cout verwendet haben. Übergeben Sie auch cout als Parameter wie x.display (cout). Das liegt daran, dass cout ein Off-Typ-Ostream ist und all diese Initialisierung in Iostream erfolgt.

0

In Ihrer Anzeigemethode verwenden Sie explizit cout. Aber das ist der "Standard out". Die Methode sollte eher Out verwenden. Ersetzen Sie also in display() jedes Auftreten von cout durch Out.

Verwenden Sie dann Anzeige (cout); in Ihrem Anruf

0

Sie übergeben kein Ostream-Objekt. Ändern Sie es zu diesem:

Dann ersetzen Sie in Ihrer Klasse alle Vorkommen von Cout mit Out. Außerdem sollte die Anzeigefunktion einen konstanten & statt void zurückgeben. Sie sollten auch Const ostream-Referenzen anstelle von Ostream verwenden.

Es ist Standard einen Operator außerhalb der Klasse zu verwenden:

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

Auf diese Weise können Dinge wie tun können:

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

Ich glaube nicht, ich hätte ein Problem beim Schreiben es auf diese Weise. Ich habe das Gefühl, dass viele meiner Projekte einfacher wären, wenn ich meine eigenen Header-Dateien schreiben könnte, aber mein Professor schließt sie bei den Projektaufgaben ein, also habe ich keine andere Wahl, als es anders zu machen. :(Aber der Teil über die Verwendung von Out statt Cout war etwas, an das ich nicht gedacht hatte, also danke für die Antwort! – user212562

+0

FYI: Der obige Code kompiliert nicht mit irgendwelchen Compilern auf meinem System (Linux: gcc oder icc) Wenn Sie tatsächlich versuchen, in den Ostream zu schreiben, bietet die GCC-Implementierung von Ostream keine "const" -Versionen von 'operator <<' für Basistypen, Sie müssen also ein nicht-konstantes ostream & -Objekt verwenden. –