Frage zum Konstruktor



  • Hi,

    ich habe eine Klasse und die funktioniert gut bis auf einen Punkt: wenn ich ein
    Objekt ohne Initialisierung anlege, also

    String s;

    meldet sich so:

    Segmentation fault (core dumped)

    Gibt's vielleicht eine Lösung?

    Danke

    ************code hier*********************

    class String
    {
    private:
    char *zeichenkette;
    public:
    String(char *zeichenkette_ = NULL):
    zeichenkette(new char [strlen(zeichenkette_) + 1])
    {
    strcpy (zeichenkette, zeichenkette_);
    }
    
    ~String()
    {
    delete [] zeichenkette;
    }
    void print();
    };
    
    void String::print()
    {
    cout << zeichenkette << endl;
    }
    


  • class String 
    { 
    private: 
       char *zeichenkette; 
    
    private:
       std::size_t strlen_helper (char * zeichenkette)
       {
          if (zeichenkette == 0)
             return 0;
          else 
            return strlen (zeichenkette);
       }
    
    public: 
       String(char *zeichenkette_ = NULL) : 
          zeichenkette(new char [strlen_helper (zeichenkette_) + 1]) 
       { 
          strcpy (zeichenkette, zeichenkette_); 
       } 
    
       ~String() 
       { 
          delete [] zeichenkette; 
       } 
       void print(); 
    }; 
    
    void String::print() 
    { 
       cout << zeichenkette << endl; 
    }
    


  • also, ich verstehe deinen konstruktor nciht so richtig, aber wenn ich das richtig sehe, dann wird zeichenkette_ NULL, wenn du kein Argument übergibts, oder? Und wenn du dann davon versuchst, die Länge zu bestimmen, von einer Zeichenkette, die auf NULL zeigt, dann gibts es diesen Fehler



  • Das liegt daran, daß strlen erwartet, daß der Pointer auf eine Zeichenkette zeigt, die mit \0 terminiert ist. Aber der NULL-Pointer zeigt da nicht hin. 😉
    Am einfachsten ist es Du machst dieses Default-Argument weg und schreibst Dir einen eigenen Default-Konstruktor. In den andere Konstruktor würde ich noch ein
    assert(zeichenkette); reinschreiben. Dann bist Du auf der sicheren Seite., allerdings müßtest Du dazu das Speicher holen aus der Initialisierungsliste rausnehmen.
    Abschließend noch der kleine Hinweis: std::string ist eine fertige string-Klasse. Nur für den Fall, daß Du's nicht weißt... ansonsten ist selber schreiben natürlich ne gute Übung und für Spezialfälle vielleicht auch mal wirklich nötig.

    MfG Jester



  • @Maxi: :p



  • @Jester: das kann ich auch: :p



  • @Helium: Hast Du mal ausprobiert was strcpy mit einem Nullpointer macht?



  • Wird nicht genau das Problem in meiner Version behandelt?

    Du hast Maxi doch die Zunge rausgestreckt, weil du schneller warst, als er. Deshalb hab ich dir die Zunge rausgestreckt, weil ich schneller war, als du.



  • Helium schrieb:

    String(char *zeichenkette_ = NULL) : 
          zeichenkette(new char [strlen_helper (zeichenkette_) + 1]) 
       { 
          strcpy (zeichenkette, zeichenkette_); //das meint er.
       }
    

    :p 😉

    Vielleicht bietet sich hier auch ein (womöglich) const char * = "\0" und ein
    assert (zeichenkette != 0) an.



  • Ups, lesen müsste man können 🙄

    Entschuldigung.



  • Hi,

    die neue strlen_helper Methode hilft nicht viel.

    Gruss


Anmelden zum Antworten