MFC: std::string vs CString?
Verwendung von C++ mit MFC. Aus einem C# - hintergrund habe ich in der Regel nur die Verwendung von string-für alle, gut, Streicher. Ich benutze Sie für Klasse, Methode, Parameter und Methoden, die Werte zurückgeben.
Nun in C++ habe ich std::string, CString, char *, LPCTSTR, und mehr. Als ich das design für meine Daten den Mitgliedern, die Parameter der Methode und Methode, die Werte zurückgeben, welche Art(en) sollte ich verwenden? Benutzerfreundlichkeit ist wichtig und CString scheint zu bieten, aber mein Instinkt geht in Richtung tragbare standards obwohl die Portabilität ist ziemlich niedrig auf meiner Liste der Prioritäten (jetzt). Auch, ich weiß nicht, wie die c-Semantik von erstellen von string-Puffer und übergeben Sie in die Methoden und Funktionen.
Denke ich, dass von einer unmittelbaren einfache Codierung Perspektive CStrings wahrscheinlich einen Vorteil haben. Aber insgesamt, was die "hohen code-Qualität" Weg, dies zu tun?
EDIT:
Ich bin vor allem besorgt über die interface-Punkte in meinem code (D. H. Methode, Parameter und Rückgabewerte). E. g.:
Shape::SetCaption(const char *caption) {...}
Shape::SetCaption(CString caption) {...}
Shape::SetCaption(std::string caption) {...}
Shape::SetCaption(std::wstring caption) {...}
InformationsquelleAutor der Frage User | 2011-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ziehe es gewöhnlich vor, sich mein coding-Stil auf den Rahmen arbeite ich im Einklang mit ihm. Also, wenn ich die Arbeit mit den MFC (die ich habe nicht für eine lange Zeit), ich bevorzuge die Verwendung von
CString
(undLPCTSTR
als Funktion der Argumente in der öffentlichkeit interface-Methoden). Bei der Arbeit mit Qt, die ich lieberQString
- und Qt-Container über STL-Container und für alles, was nicht direkt mit einem solchen Rahmen ich verwendenstd::string
als es die standard-C++ - Umgang mit strings.Es nicht so einen großen Unterschied machen, da Sie alle bieten mehr oder weniger die gleiche Funktionalität (und sind leicht umwandelbar in jedem anderen) und wenn der code geschrieben für einen bestimmten Rahmen, es hängt davon ab, es trotzdem, so Portabilität ist nicht so eine große Sorge.
Einfach nicht die Mühe mit einfachen char-arrays! Und by the way, versuchen Sie, die Objekte übergeben, die von const-Referenz (
const std::string &caption
) und nicht als Wert, als in C++ werden Variablen nicht automatisch Bezüge und kopieren einer Zeichenfolge kann Recht teuer werden.InformationsquelleAutor der Antwort Christian Rau
MFC geschrieben wurde, mit der Erwartung, dass Sie verwenden würden, CString. Dies ist besonders offensichtlich, wenn eine Funktion einen parameter verwendet, um einen string zurückgeben. Zum Beispiel, vergleichen Sie diese beiden Anrufe zu GetWindowText:
Konvertieren zwischen den beiden ist nicht schlecht, obwohl, so dass Sie beeinträchtigen könnten, durch die Verwendung von std::wstring für die meisten Dinge und einen temporären CString, wenn nötig.
Edit: Es kann ein Weg zur Automatisierung der temporären CString. Faire Warnung, dies ist ein kompletter hack. Ich habe noch nicht ausprobiert, also keine Garantie - Sie erhalten wahrscheinlich Warnungen über das binden von einem temporären zu einem non-const Referenz, aber Sie können schalten Sie diese aus.
InformationsquelleAutor der Antwort Mark Ransom
Wenn Sie sich für Portabilität und du bist mit C++ verwenden
std::string
. No-Punkt, low-level mitchar
arrays, wenn Sie nicht brauchen, um. Wenn Sie don ' T care für die Portabilität und die Plattform-zur Verfügung gestellt Saiten bieten mehr Funktionen, die Sie brauchen, mit allen Mitteln, die Sie verwenden. Sie könnten tatsächlich mehr optimiert für die Plattform.InformationsquelleAutor der Antwort rid
Nicht die Verwendung von CString. Es verwendet eine KUH, die Umsetzung, die ist sehr anfällig für Dinge wie threading. Verwenden Sie nicht
char*
oderLPCTSTR
(das ist nurconst char*
oderconst wchar_t*
unter einem anderen Namen), da Sie nicht verwalten Sie Ihre eigenen Speicher. Verwenden Sie einestd::string
für 8-bit codepoints oderstd::wstring
für 16-bit codepoints auf Windows (32 bit, für Unix).InformationsquelleAutor der Antwort Puppy