Exceptions



  • Hallo Leute
    Kann mir mal jemand erklähren, wieso diese Scheisse nicht funktioniert ???
    Der Destruktor der Klasse Exception wird aufgerufen, bevor Exception::showErrStr() aufgerufen wird... Was soll denn dass, verflucht noch mal ???

    #include <iostream>
    
    using namespace std;
    
    class Exception{
    private:
     char *pErrStr;
    public:
     Exception(char *pErrStr){
            cout << "Konstruktor aufgerufen\n";
      this->pErrStr = new char[strlen(pErrStr)+1];
      strcpy(this->pErrStr,pErrStr);
     }
     ~Exception(void){
      delete []this->pErrStr;
            cout << "Destruktor aufgerufen\n";
     }
     showErrStr(void){
      cout << this->pErrStr;
     }
    };
    
    class Object{
    public:
     Object(void){
      throw Exception("Scheisse");
     }
     ~Object(void){
     }
    };
    
    int main(void){
     try{
      Object obj;
     }
     catch(Exception &e){
      e.showErrStr();
     }  
     return 0;
    }
    


  • für members brauchst du kein this:

    //statt
    delete []this->pErrStr;
    //einfacher
    delete[] pErrStr;
    


  • So sollt's gehen:

    #include <iostream>
    
    using namespace std;
    
    class Exception{
    private:
     char *pErrStr;
    public:
     Exception(char *pErrStr){
            cout << "Konstruktor aufgerufen\n";
      this->pErrStr = new char[strlen(pErrStr)+1];
      strcpy(this->pErrStr,pErrStr);
     }
        Exception(const Exception &src)     //Änderung Start
        {
            cout << "Copy-Konstruktor aufgerufen\n";
            pErrStr = new char[strlen(src.pErrStr)+1];
            strcpy(pErrStr, src.pErrStr);
        }                                                                    //Änderung Ende
     ~Exception(void){
      delete []this->pErrStr;
            cout << "Destruktor aufgerufen\n";
     }
     showErrStr(void){
      cout << this->pErrStr;
     }
    };
    
    class Object{
    public:
     Object(void){
      throw Exception("Scheisse");
     }
     ~Object(void){
     }
    };
    
    int main(void){
     try{
      Object obj;
     }
     catch(Exception &e){
      e.showErrStr();
     }  
     return 0;
    }
    

    Auch wenn du dein Fehlerobjekt über eine Referenz auffängst, wird das Objekt einmal kopiert. Deshalb musst du einen Copy-Konstruktor schreiben, der den ganzen String und nicht nur die Zeiger darauf kopiert.



  • @Steven
    Funktioniert es möglicherweise auch so ?? (um Code zu sparen...)

    #include <iostream> 
    
    using namespace std; 
    
    class Exception{ 
    private: 
     char *pErrStr; 
    public: 
     Exception(char *pErrStr){ 
            cout << "Konstruktor aufgerufen\n"; 
      this->pErrStr = new char[strlen(pErrStr)+1]; 
      strcpy(this->pErrStr,pErrStr); 
     } 
        Exception(const Exception &src)     //Änderung Start 
        { 
         *this = Exception(rsc->pErrStr); // nicht gut ??
    
         /* Scheiss auf diesen Code :-)
            cout << "Copy-Konstruktor aufgerufen\n"; 
            pErrStr = new char[strlen(src.pErrStr)+1]; 
            strcpy(pErrStr, src.pErrStr); 
         */
        }                                                                    //Änderung Ende 
     ~Exception(void){ 
      delete []this->pErrStr; 
            cout << "Destruktor aufgerufen\n"; 
     } 
     showErrStr(void){ 
      cout << this->pErrStr; 
     } 
    }; 
    
    class Object{ 
    public: 
     Object(void){ 
      throw Exception("Scheisse"); 
     } 
     ~Object(void){ 
     } 
    }; 
    
    int main(void){ 
     try{ 
      Object obj; 
     } 
     catch(Exception &e){ 
      e.showErrStr(); 
     }   
     return 0; 
    }
    


  • *this = Exception(rsc->pErrStr); // nicht gut ??
    

    Das heißt den Teufel mit dem Belzebub vertreiben...

    Hier wird der operator = () aufgerufen, der auch noch nicht definiert ist. Bei Klassen die Resourcen verwalten ist es immer wichtig, das Copy-Kontruktor und Gleich-Operator zu definieren. Sonst gibt es Probleme...

    P.S.: Wieso nicht std::string - Damit wären sämtliche Probleme von allein gelöst. Bei der Benutzung von new (und damit auch delete) sollte man äußerst sparsam sein und sie nur dann verwenden, wenn es sich nicht vermeiden


Anmelden zum Antworten