Methoden operator<< und operator>>
-
Hallo,
ich habe folgendes Programm zu schreiben:
Erstellen Sie eine Klasse Liste, in der beliebig viele Integerwerte gespeichert werden können. Implementieren Sie die Methoden operator<< und operator>> so, dass Listen formartiert ausgegeben und eingelesen werden können. (Gewünschtes Format für die Darstellung einer Liste mit den drei Werten 1, 2 und 3 als Inhalt ist [1,2,3].)Bis jetzt habe ich folgendes gemacht:
#include <iostream>
using namespace std;class Liste {
public:
int x; //Anzahl der eingegebenen Zahlen
int *y;
Liste () {x=0;}
~Liste() {if
delete [] y;} //Destruktorvoid werte(int zahl) {
if(zahl == 0)
return;
if(x == 0) {
y = new int[x+1];
x++; }
else{
int *iarr = new int[x+1];
for (int i = 0; i < x; i++){
iarr[i] = y[i];}
x++;
y = iarr;
}
}
};ostream& operator>>(ostream& out, const Liste& o){
out << '[';
for (int i=0; i<o.x; i++) {
out << o.y[i];
if (i != (o.x-1))
out << ',';
else
out << ']';
}
return out;
}istream& operator>>(istream& in, const Liste& in) {
in >> '[';
for (int i=0; i<in.x; i++) {
in >> in.y[i];
if (i != (in.x-1))
in >> ',';
else
in >> ']';
}
return in;
}int main () {
Liste z;
int zahl;
cout << "Bitte geben Sie beliebig viele Zahlen ein (mit 0 beenden Sie die Eingabe): " << endl;
do {
cin >> zahl;
z.werte(zahl);
} while(zahl != 0);
cout<< "Die Liste beinhaltet die Werte: " << z;
}Die Methode ostream& operator>> hat schon mal funktioniert, allerdings habe ich keine Idee wie ich istream& operator<< einbauen kann bzw. wie die Liste direkt mit der vorgegebenen Formatierung eingegeben werden kann.
Meine Fehlerliste sieht folgenderweise aus:
../9.2.cpp:41: error: conflicting declaration ‘std::istream& in’
../9.2.cpp:41: error: ‘in’ has a previous declaration as ‘const Liste& in’
../9.2.cpp:42: error: no match for ‘operator>>’ in ‘in >> '['’
../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
../9.2.cpp:44: error: no match for ‘operator>>’ in ‘in >> ((int*)in->Liste::y)[i]’
../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
../9.2.cpp:46: error: no match for ‘operator>>’ in ‘in >> ','’
../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
../9.2.cpp:48: error: no match for ‘operator>>’ in ‘in >> ']'’
../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
../9.2.cpp:50: error: invalid initialization of reference of type ‘std::istream&’ from expression of type ‘const Liste’
make: *** [9.2.o] Error 1Bin um jede Hilfe dankbar

-
Die Fehlermeldung bezieht sich auf diese Zeile:
istream& operator>>(istream& in, const Liste& in) {../9.2.cpp:41: error: conflicting declaration ‘std::istream& in’
../9.2.cpp:41: error: ‘in’ has a previous declaration as ‘const Liste& in’Fällt dir was auf?
-
ich depp. habe den Teil geändert:
istream& operator>>(istream& in, const Liste& inp) {
in >> '[';
for (int i=0; i<inp.x; i++) {
in >> inp.y[i];
if (i != (inp.x-1))
in >> ',';
else
in >> ']';
}
return in;
}allerdings bekomme ich immer noch fehlermeldungen:
../9.2.cpp:42: error: ambiguous overload for ‘operator>>’ in ‘in >> '['’
../9.2.cpp:46: error: ambiguous overload for ‘operator>>’ in ‘in >> ','’
../9.2.cpp:48: error: ambiguous overload for ‘operator>>’ in ‘in >> ']'’
/us
-
Hi,
kannst du mir das erklären?in >> ']';
-
Die Aufgabenstellung sagt ja, dass die Liste mit einer bestimmten Formatierung ein- und ausgegeben werden soll. Also die Eingabe soll wie die Ausgabe aussehen.
(Gewünschtes Format für die Darstellung einer Liste mit den drei Werten 1, 2 und 3 als Inhalt ist [1,2,3].)
-
Ja, es wäre schön, wenn das so in der Art gehen würde. Aber leider kann man so nicht Zeichen überspringen. Erstelle dir eine temporärere char Variable, lies darin ein und prüfe, ob sie '[' ist.
-
Könntest du mir das vllt ein bisschen genauer erklären. Stehe gerade ein bisschen auf dem Schlauch. Habe eben nochmal probiert es so zu machen: (funktioniert aber auch nicht)
istream& operator>>(istream& in, const Liste& inp) {
int k=x-1; //Anzahl Komma
char q[x+k+2]; //hat Größe: Anzahl Zahlen, Anzahl Komma, zwei Klammern
int i=0;
q[i]='[';
for (int i=1; i<inp.x; i++) {
q[i]=inp.zahl[y];
i++;
if (i != (inp.x-1))
q[i]= ',';
i++;
else
q[i]= ']';
}
return in;
}wie kann ich denn meine Zahlen einlesen?

-
Er meint nur ein einzelnes Zeichen einlesen:
char c; in >> c; if (c != '[') // errorWas du im Fehlerfall machst, ist dir überlassen.
Typischerweise schreibt man da
in.setstate(std::ios_base::failbit); return in;
-
habe den Teil jetzt so geändert:
istream& operator>>(istream& in, const Liste& inp) {
char c;
in >> c;
if (c != '[')
in.setstate(std::ios_base::failbit);
else
do {
in >> c;
} while (c >= 0 || c ==',');
if (c == ']')
return in;
}allerdings funktioniert die ausgabe jetzt nicht mehr.
-
class Liste { public: int x; // tolle int *y; // namen Liste() { x = 0; } ~Liste() { if (y) delete[] y; } // if unnoetig, delete[] 0 hat keine Wirkung. void werte(int zahl) { if (zahl == 0) // den Spezialfall wirklich hier behandeln? return; if (x == 0) { y = new int[x + 1]; // wenn du 1 meinst, dann schreib 1 hin. "new int" taets auch. y[x] = zahl; // *y = zahl x++; } else{ int *iarr = new int[x + 1]; for (int i = 0; i < x; i++){ iarr[i] = y[i]; } iarr[x] = zahl; x++; y = iarr; // der pointer auf den alten Speicherbereich ist jetzt futsch. wer gibt den Speicher frei? } } };
-
xhkjd
-
Verwende bitte [code]-Tags, wenn du code postest.
Du verwendest denistream& operator>>(istream& in, const Liste& inp)nirgends. In dermain()ließt du immer noch in einenintein, nicht in eineListe. Wenn du wie bisher1[enter]2[enter]...0[enter]eingibst läuft dein Programm wie vorher.
Amoperator>>()stimmt noch was nicht. Du ließt immer in einencharnie einenintund du veränderst die Liste darin garnicht.
-
xcvnb