Compiliert nicht
-
Hallo,
zum üben von Operatorenüberladung habe ich ein programm geschrieben doch er kompiliert nicht ich kriege den Fehler C4621.
In den Kommmentaren steht was normalerweise gemacht werden soll.
// ++++++++++++++++++++++++++++++++++++++++++++ // // // // Name: // // Datei: // // Klonen von einzelnen zeichen // // // // ++++++++++++++++++++++++++++++++++++++++++++ // #include <iostream> #include <string> #include <conio.h> using namespace std; class cZeichenKlon{ private: char zeichen; // Speicher des zu klonenden Zeichens int anzahlKlone; // Die Widerholung des char Zeichens public: cZeichenKlon(char zeichen=0, int anzahlKlone=0){ // Konstruktor this->anzahlKlone=anzahlKlone; this->zeichen=zeichen;} void print(){ // Ausgabe der Attribute cout << zeichen << endl << anzahlKlone << endl;} // ------------ setMethoden ------------------------- // int setanzahlKlone(int k){this->anzahlKlone=k;} int getanzahlKlone(){return this->anzahlKlone;} // ------------ getMethoden ------------------------- // char getZeichen(){return zeichen;} char setZeichen(char s){this->zeichen=s;} cZeichenKlon& operator++ (){ // Überladen des //Orators++ zum erhöhen der anzahl der Klone cZeichenKlon::anzahlKlone++; return *this;} cZeichenKlon& operator-- (){ // Überladung des Operator-- cZeichenKlon::anzahlKlone--; return *this;} // --------------- Ausgabeoperator -------------------------------------- // friend ostream& operator<< (ostream& stream, cZeichenKlon& klon){ stream << klon.getZeichen(); // Gibt das Zeichen aus for(int i=0; i<klon.getanzahlKlone(); i++){stream << klon.getZeichen();} // und klont das Zeichen um den wert von anzahlKlone return stream; } // ------------------------- Eingabeoperator --------------------- // friend istream& operator>> (istream& in, cZeichenKlon& kette){ // String entgegennehmen länge und string c=""; // Widerholung der zeichen speichern int laenge; int widerholung; in >> c; // Geht den String durch und zählt widerholung //der Zeichen ansonsten bricht er ab for(int i=0; i<c.length();i++){if(c[i+1]!=0 && c[i]!=c[i+1]) break; else {kette.setZeichen(c[i]); widerholung++;} return in; } } }; // ------------------ Hauptprogramm ------------------------- // // Testet die Überladungs Operatoren // int main(){ cZeichenKlon z1(' ',0); z1.print(); cout << z1; z1++; z1++; cout << z1; cin >> "eeeee"; cout << z1; z1--; cout << z1; while(!_kbhit()); return 0; }
-
cin >> "eeeee";Was möchtest du hier machen? Wenn du was ausgeben willst, wäre vielleicht cout angebrachter. cin ist für Eingaben, und du kannst dem Stringliteral "eeeee" keine eingabe zuweisen.
EDIT: Beim nächsten Mal bitte auch die Zeile angeben, in der der Fehler auftritt. Dann muss man für sowas triviales nicht immer den ganzen Code durch den eigenen Compiler jagen.

-
cin >> "eeeee";in Zeile 87 macht nicht besonders viel Sinn. Ich weiß ned genau was du machen willst, aber mit cin liest du nen Wert ein und speicherst in in einer Variablen.
cin >> Variablenname;// edit: sry, zu langsam
-
es soll halt so aussehen als ob der Benutzer diese zeichenkette eingegeben hat cin >> habe ich verwendet da ich den Operator testen wollte.
Syntaktisch scheint alles korrekt zu sein der Fehler müsste beim ++Operator liegen, weil er sagt "er konnte etwas nicht finden und benutzt jetzt den Postfix Operator".
Es ist nur ein Fehler und auch nur ein Warning aber er lässt mich trotzdem das Programm nicht starten.
-
-Fehler ist in Zeile 67 Konflikt '<' zwischen signed und unsigned
-Zeile 63 warning C4101: 'laenge': Unreferenzierte lokale Variable
-Zeile 81 warning C4621: Keine Postfix-Form des Operators '--' für den Typ 'cZeichenKlon' gefunden, Präfix-Form verwendet
-
Gast4621 schrieb:
es soll halt so aussehen als ob der Benutzer diese zeichenkette eingegeben hat cin >> habe ich verwendet da ich den Operator testen wollte.
Wut??

Gast4621 schrieb:
Es ist nur ein Fehler und auch nur ein Warning aber er lässt mich trotzdem das Programm nicht starten.
Und diesen einen Fehler haben wir dir genannt. Danach lässt sich das Programm starten. Zu deiner Warnung: du musst den operator++ auch für Postfix-Notation überladen.
-
Gast4621 schrieb:
-Fehler ist in Zeile 67 Konflikt '<' zwischen signed und unsigned
Mach aus der Zählvariable i einfach ein unsigned int oder size_t, dann ist die Warnung verschwunden.
Gast4621 schrieb:
-Zeile 63 warning C4101: 'laenge': Unreferenzierte lokale Variable
Jo, du deklarierst eine Variable, die du gar nicht benutzt. Also entweder benutzen oder raus damit.
Gast4621 schrieb:
-Zeile 81 warning C4621: Keine Postfix-Form des Operators '--' für den Typ 'cZeichenKlon' gefunden, Präfix-Form verwendet
Hatte bereits was dazu gesagt.
-
Glaubst du uns jetzt nicht dass
cin >> "eeeee";falsch ist, oder versteh ich deine Antwort falsch?
Die Sache mit dem Prä- und Postinkrement ist so, da du den Präinkrementoperator überschreibst.
Siehe hierzu http://www.c-plusplus.net/forum/232010 Punkt 3.10
-
Es kompiliert jetzt schonmal vielen Dank für die Antworten.
-
Gast4621 schrieb:
Es kompiliert jetzt schonmal vielen Dank für die Antworten.
Und zu allen Warnings habe ich auch was geschrieben. Bitte nicht überlesen, sondern berücksichtigen.
Und noch was: deine Formatierung ist grauenhaft, sorry.
Das hierfor(int i=0; i<c.length();i++){if(c[i+1]!=0 && c[i]!=c[i+1]) break; else {kette.setZeichen(c[i]); widerholung++;}kann man ja kaum lesen. Warum sieht das nicht so aus:
for(int i=0; i<c.length();i++) { if(c[i+1]!=0 && c[i]!=c[i+1]) break; else { kette.setZeichen(c[i]); widerholung++; }Hey, Moment mal! Da offenbaren sich ja plötzlich Ungereimtheiten! Du denkst sicher, dass das folgende
return in;(siehe kompletter Quellcode) außerhalb derfor-Schleife steht, wie du es ja auch durch die Einrückung deutlich gemacht hast. Stimmt aber nicht, es ist Bestandteil der Schleife und wird ohne weitere Bedingung am Ende des ersten Schleifendurchlaufs ausgeführt. Das heißt, deine Schleife wiederholt sich nie, da immer beim ersten Durchgang perreturnaus der Funktion gesprungen wird. War dir das klar? Mit vernünftiger Einrückung wäre das nicht passiert.