Probleme mit ostream
-
Hallo!
Ich habe ein Problem mit dem ostream undzwar hab ich ein Objekt :
IntMenge{ //[...] private: int n; // Zahl der Elemente der Menge int menge[Dim]; // Feld der Elemente der Menge };und will jetzt zur Ausgabe den ostream überladen:
ostream& operator<<(ostream& o,const IntMenge& ausmenge){ // Ausgabe der Menge auf der Standardausgabe int ende=ausmenge.getanz() for(int i=0;i<ende ;i++){ o << ausmenge.getmenge(i); } return o; }Was aber nicht geht. Könnt ihr mir helfen?
-
Was sagt denn dein Compiler dazu? Und wie sehen die Methoden getanz() und getmenge() aus?
ausmenge.n ist auf jeden Fall privat, darauf kann der Ausgabe-Operator nur zugreifen, wenn die Klasse ihn als friend einstuft. Außerdem fehlt am Ende von Zeile 2 ein Semikolon.
PS: Ich hoffe, Dim ist groß genug für alles, was du in Mengen packen willst - ansonsten würde ich statt des Arrays lieber einen std::vector<> verwenden.
-
was "geht" nicht?
-
-error C2804: Binärer Operator '<<' hat zu viele Parameter
-error C2333: 'IntMenge::operator <<': Fehler in Funktionsdeklaration; Funktionstext wird übersprungenDie Fehler sind in der Zeile
ostream& operator<<(ostream& o,const IntMenge& ausmenge){int getanz(){ return this->n; } int getmenge(int n){ return this->menge[n]; }Dim ist groß genug :
const unsigned int Dim=256;es sollen nur mit < 10 Zahlen im array gearbeitet werden
-
Kennst du das Schlüsselwort
friend?
-
Apropos: Mengen sind in der Standardbibliothek implementiert! Sie heissen
std::setund sind in<set>.
-
ja Danke!
Die fehler sind jetzt mit dem friend weg. Jetzt hab ich nurnoch ein paar Konvertierungsfehler. Damit komm ich aber zurecht.
Danke nochmal!
manchmal scheint das einfache so schwierig

-
Wenn du einen Operator als Klassen-Methode überlädst, wird als erster Operand implizit
*thisverwendet, deswegen brauchst du dort einen Parameter weniger. Aber das kommt für den Ausgabe-Operator nicht in Frage, weil der erste Operand kein IntMenge ist, sondern ein ostream. Da bleibt dir nur ein globaler Operator (d.h. außerhalb deiner Klasse).Der nächste (subtile) Fehler liegt in deinen get-Methoden - du willst sie über eine konstante Referenz aufrufen (und außerdem ändern sie den Zustand des Objekts nicht, also solltest du sie auch als konstant definieren:
int getanz() const { return this->n; } int getmenge(int n) const { return this->menge[n]; }Edit:
EOutOfResources schrieb:
Kennst du das Schlüsselwort
friend?friend ist hier nicht mal nötig, die Ausgabe lässt sich komplett über die öffnetliche Schnittstelle implementieren.
-
CStoll schrieb:
friend ist hier nicht mal nötig, die Ausgabe lässt sich komplett über die öffnetliche Schnittstelle implementieren.
Vielleicht hat er die Getter nur wegen dem Ausgabeoperator implementiert.
-
EOutOfResources schrieb:
CStoll schrieb:
friend ist hier nicht mal nötig, die Ausgabe lässt sich komplett über die öffnetliche Schnittstelle implementieren.
Vielleicht hat er die Getter nur wegen dem Ausgabeoperator implementiert.
Und was bringt eine Menge ohne Getter bitte?
-
EOutOfResources schrieb:
CStoll schrieb:
friend ist hier nicht mal nötig, die Ausgabe lässt sich komplett über die öffnetliche Schnittstelle implementieren.
Vielleicht hat er die Getter nur wegen dem Ausgabeoperator implementiert.
Glaube ich in diesem Fall kaum. Generell würde ich friend vermeiden, wenn es wie in diesem Beispiel so einfach zu umgehen geht, denn dadurch erhöht er auch die Kapselung.
Lg freeG