Frage zum Konstruktor
-
Hi,
ich habe eine Klasse und die funktioniert gut bis auf einen Punkt: wenn ich ein
Objekt ohne Initialisierung anlege, alsoString 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