Verstehe nicht wie diese Klasse funktioniert



  • 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