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 hier

    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++;}
    

    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 der for -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 per return aus der Funktion gesprungen wird. War dir das klar? Mit vernünftiger Einrückung wäre das nicht passiert. 😉


Anmelden zum Antworten