alternative zu strdup
Ich Schreibe ein C++ - Klasse für ein Buch, das einen Namen enthält:
class Book {
private:
char* nm;
..........
............
..........
...........
};
Darf ich nicht verwenden std::string
in diese Abtretung an. So hier bin ich mit strdup
kopieren Sie den Wert des Parameters name in nm, die im Konstruktor:
Book::Book(const char *name, int thickness, int weight)
: nm(NULL)
, thck(thickness)
, wght(weight)
{
if (name)
nm = strdup(name);
}
Gibt es eine alternative zu erreichen das gleiche Ergebnis ohne Verwendung strdup
, sondern mithilfe des keyword - new
statt?
In der Regel verwenden Sie
Warum können Sie nicht einfach verwenden
es ist eine Einschränkung für die Belegung... vielleicht sollte ich hinzufügen, ein Hausaufgaben-tag da... und ja, STL-ich meine, mit string
wahrscheinlich es sollte ein weiterer tag
Diese Zuordnung muss zunächst konzipiert worden, bevor strdup war Teil der standard-Bibliothek. Sicherlich die Antwort auf die Frage "Wie würden Sie duplizieren Sie eine Zeichenfolge ohne strdup?" sollte " Warum sollte ich?" 🙂
std::string
aber was genau meinst du mit "ohne mit der C++ STL Bibliothek"? d.h. welche Teile der standard-Bibliothek, die Sie versuchen zu vermeiden (und warum)?Warum können Sie nicht einfach verwenden
strdup
? Du fragst nach einem tool, etwas zu tun, während Sie sich weigert, mit der ideal.es ist eine Einschränkung für die Belegung... vielleicht sollte ich hinzufügen, ein Hausaufgaben-tag da... und ja, STL-ich meine, mit string
wahrscheinlich es sollte ein weiterer tag
not-a-real-problem
...Diese Zuordnung muss zunächst konzipiert worden, bevor strdup war Teil der standard-Bibliothek. Sicherlich die Antwort auf die Frage "Wie würden Sie duplizieren Sie eine Zeichenfolge ohne strdup?" sollte " Warum sollte ich?" 🙂
InformationsquelleAutor aherlambang | 2010-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genaugenommen: Die
string
- Klasse ist Teil des Strings-Bibliothek. Dies ist viel einfacher zu bedienen, dynamisch in der Natur und Sie haben weniger sorgen, wenn das kopieren/zuweisen als C-style-strings.Der andere Ansatz ist das manuelle kopieren aus:
Das problem bei diesem Ansatz ist, dass man die Speicherverwaltung selbst und implementieren Sie die Große-drei spezielle member-Funktionen selbst (und stellen Sie sicher exception-Sicherheit so viel wie Sie können).
Sie nicht haben, um zu überprüfen
if (p)
nachnew
, weil nur nothrow neue kann null-Zeiger. Sie müssen frei das alte array inoperator=
. Copy-and-swap wird in der Regel besser.Ja, der zweite war ein Tippfehler. Der ehemalige ich wollte so einen Kommentar. (Ich nahm an, der OP ist die Arbeit in einer geschützten Umgebung und verfügen möglicherweise nicht über Zugriff auf die Ausnahmebehandlung.)
Ich denke, dass löschen p gemeint ist delete [] nm. Auch, wie über einen set_string-Funktion anstelle von kopieren und einfügen von code.
und einmal haben Sie set_string, Sie könnten entscheiden, um die Wiederverwendung nm, wenn es groß genug für die nächste Zeichenfolge, etc (anstelle der Zuweisung einen neuen und schmeißt den alten)
InformationsquelleAutor dirkgently
Nicht wirklich eine Antwort, aber eine Korrektur zu dirkgently ist, die passt nicht in einen Kommentar: man sollte wirklich nicht schreiben, so viel code wie er.
Sichere Objekt kopieren ist nicht etwas, das Sie möchten, zu bekommen, zu schlecht, obwohl im realen Leben der beste Weg, dies zu vermeiden, ist natürlich die Verwendung der entsprechenden library-Klassen in den ersten Platz. Das heißt, eine einfache C-Stil-string ist so gut ein Beispiel, wie alles andere üben mit:
Sehen, die "nicht eine exception zu werfen!" - Warnung in den Konstruktor? Das ist, weil, wenn Sie tun, wird die Zeichenfolge zugespielt werden. Wenn Sie mehr als eine Ressource in Ihrer Klasse, Bedarf der ausdrücklichen Befreiung, das ist, wenn die Dinge wirklich langweilig. Das Recht, was zu tun ist, um eine Klasse schreiben, nur für die Zwecke der Abhaltung der string-und die andere für den Zweck des Haltens der anderen Ressource, und ein Mitglied von jeder Art in deinem Buch Klasse. Dann brauchen Sie sich keine Gedanken über Ausnahmen im Konstruktor, da Mitglieder, die gebaut wurden, werden zerstört, wenn der Konstruktor Körper von der enthaltenden Klasse wirft. Sobald Sie dies getan haben ein paar mal, werden Sie sehr stark mit der standard-Bibliotheken und TR1.
Normalerweise, um Sie zu retten Arbeit, die Sie würde damit beginnen, indem Sie Ihre Klasse nicht kopierbar, und nur implementieren Sie den copy-Konstruktor und operator= wenn es sich herausstellt, dass Sie Sie benötigen:
Jedenfalls
strdup
ist kein großes Geheimnis. Hier sind ein paar sehr ähnliche Implementierungen (von GNU), nur durch die Suche nach "strdup.c". Der gleiche Ansatz funktioniert in der Regel für andere string-handling-Funktionen, und im Allgemeinen alles, was nicht erforderlich spezielle Plattform-abhängige Mechanismen zu implementieren: suchen Sie nach "function_name.c", und Sie werden wahrscheinlich feststellen, eine GNU-Implementierung, die erklärt, wie es gemacht, und wie kann man ähnliche, aber verschiedene Dinge. In diesem Fall würden Sie starten mit Ihrem code und ersetzen Sie den Aufrufmalloc
und das error-handling.http://www.koders.com/c/fidF16762E3999BA95A0B5D87AECB0525BA67CEE45A.aspx
http://cvs.frodo.looijaard.name/viewvc/cgi-bin/viewvc.cgi/public/psiconv/compat/strdup.c?revision=1.1.1.1&view=markup
InformationsquelleAutor
Ja, es gibt eine alternative.
nm
zu Ihrem reservierten ArraysOder verwenden Sie
strdup
- btwstrdup
ist nicht Teil derC++ STL
.InformationsquelleAutor stefanB
Sie haben sich malloc mit strlen und verwenden Sie dann strcopy. Blöde Hausaufgaben btw.
InformationsquelleAutor ypnos
D ' Oh! Vielen Dank - es ist nun behoben.
InformationsquelleAutor JBRWilkinson