Verstehe nicht wie diese Klasse funktioniert



  • _string = new char[];
    

    Du musst new noch sagen wieviel Speicher er reservieren soll... Und so reserviert er nur den Speichreplatz für einen Pointer auf char. Ich kenne mich mit new leider nicht so aus... Aber ich glaube das müsste so aussehen:

    _string = new char[sizeof(string)];
    

    Wie gesagt ist mal nen Schuss ins Blaue 🙂

    *edit*
    Schau am besten mal in eine Referenz Deiner Wahl wie new genau funktioniert. Hab gerade nix dabei, aber auf den von c-plusplus.net verlinkten tuts gab es etwas was pointer und new so erklärt hat, daß ich es auch (fast) verstanden hab



  • nicht sizeof, sondern strlen(string) + 1 zeichen für '\0'.
    Und keine Unterstriche als Beginn für Variablennamen verwenden!



  • Und wo soll ich den Speicher wieder freigebe? Ich habe schon so vieles ausprobiert. Auch im destruktor habe ich versucht mit delete Speicher freizugeben. Doch dann stürztz das Programm ab.



  • Ah und das funktioniert auch nicht so wie oben mit new.

    string f() {
      char test[]="Hallo";
      string result(test);
      return result; 
    }
    


  • Du musst zwischen Kopierkonstruktor und Zuweisungsoperator unterscheiden.
    Zuerst Speicher von der richtigen Größe anfordern (new char[size]),
    dann den string kopieren (strcpy(m_string, string)) und beim Zuweisungsoperator eben zuerst den alten string mittels delete [] löschen.
    Im Destruktor dann einfach mit delete [] löschen.
    Poste Code, dann sagen wir dir, was genau nicht funktioniert.



  • davie schrieb:

    beim Zuweisungsoperator eben zuerst den alten string mittels delete [] löschen.

    ...zuallererst aber auf selbstzuweisung prüfen.



  • 😃 Jetzt geht es langsam voran.

    string f() {
      char test[]="Hallo";
      string result(test);
      return result; 
    }
    
    string str=f();
    .
    .
    .
    

    Das geht jetzt.

    So sehe die Konstruktoren aus:

    string::string ():_string(0){_string = new char[];}
    		string::string (char* t)
    		{
    			int l;
    
    			l=len(t)+1;
    
    			_string=new char[l];
    
    			l=0;
    
    			while(t[l])
    			{
    				_string[l]=t[l];
    				l++;
    			}
    			_string[l]='\0';
    		}
    

    Das sind die überladenen Operatoren:

    string operator=(char* t)
    		{	
    			if(_string)
    				delete[] _string;
    
    			int l;
    
    			l=len(t)+1; // len() ist eine eigene Funktion!!!
    
    			_string=new char[l];
    
    			l=0;
    
    			while(t[l])
    			{
    				_string[l]=t[l];
    				l++;
    			}
    			_string[l]='\0';
    
    			return *this;
    		}
    
    		string operator=(string& st)
    		{
    			if(_string)
    				delete[] _string;
    
    			char* t=st._char();
    
    			int l;
    
    			l=len(t)+1;
    
    			_string=new char[l];
    
    			l=0;
    
    			while(t[l])
    			{
    				_string[l]=t[l];
    				l++;
    			}
    			_string[l]='\0';
    
    			return *this;
    		}
    

    Jetzt habe ich ein Problem beim Destruktor stürzt das Programm ab. bzw. das OS meldet sich zu Wort. 🙄

    string::~string()
    		{
    			if(_string)
    				delete[] _string;
    		}
    

    Ich weiss man soll keine Variablem mit einem Unterstrich beginnen. Aber alles nur zu Übung 🙂
    Ich bin trotzdem für jeden Verbesserungshinweis dankbar. 👍

    PS:
    Das sind noch Methoden die oben verwendet werde.

    //  Zeiger auf char zurück geben
    		char* 
    		string::_char(void){
    			return _string;}
    
    //  Länge des Strings 
    		int 
    		string::len(){
    			int l=0;
    			while (_string[l]){l++;}
    			return l;}
    
    	//  Länge des Strings
    		int 
    		string::len(char* s){
    			int l=0;
    			while (s[l]){l++;}
    			return l;}
    

    Ich hoffe das war jetzt nicht zu viel



  • 😕



  • Und was kommt für eine Meldung beim Destruktor? Der selbst sieht richtig aus.

    Code-Hacker



  • Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)



  • Ich konnte den Fehler lokalisieren.

    Er liegt im diesem überladenen Operator:

    string operator=(string st)
    		{
    			if(_string)
    				delete[] _string;
    
    			char* t=st._char();//char aus string holen!
    
    			int l;
    
    			l=len(t)+1;//Laenge von t
    
    			_string=new char[l];
    
    			l=0;
    
    			while(t[l])
    			{
    				_string[l]=t[l];
    				l++;
    			}
    			_string[l]='\0';
    
    			return *this;
    		}
    

    Ich weiss nur nich wo genau 😃


Anmelden zum Antworten