CString oder string?
-
CString a = "Hello"; // hier wird Speicher alloziert und der initialisierungsstring kopiert CString b = a; // hier wird *keine* Kopie angefertigt! nur ein Referenzzähler hochgezählt. // b und a verwenden das gleiche interne CStringData - Objekt b+=" World"; // erst jetzt wird eine Kopie von des ursprüngliche Strings erstellt, // da b verändert wird. a behält den Ursprünglichen Wert, an b wird angehängtNach außen verhält sich der String "wie erwartet", intern wird aber das kopieren (was oftmals gar nicht nötig ist) geschieht erst wenn der String selbst wirklich verändert wird. Das hilft ungemein, "bequeme" Interfaces zu schaffen, ohne Effektivität zu verlieren.
Häufigster Fall: Wird ein CString als (By-Value-)Funktionsparameter oder als Return-Wert übergeben, wird keine Kopie erzeugt.
Beispiel:
CString CFoo::GetItemText() { return m_itemText; } void CBar::SetName(CString s, bool appendSpace = false) { if (appendSpace) s += ' '; ...// was auch immer mit s geschehen soll } // ohne eine einzige Kopie: bar.SetName(foo.GetItemText());Referenzgezählte Objekte können in Multithreaded-Programmen allerdings bremsen, wenn die Referenzzähler häufig aus verschiedenen Threads rauf- und runtergezäht werden, und jedesmal ein Thread auf den anderen warten muß. Aber wenn man das weiß, kann man sein Programm halt dementsprechend anpassen...
-
generell würd ich sagen wenn du für nur ein system entwickelst benutz die systemeigenen tools weil sie in die umgebung passen
d.h. du musst weniger schreiben wenn du cstring in einer ms umgebung benutzt
sobald du auf mehreren systemen arbeitest brauchst du zwingend den stl string, oder char pointer bzw. eine eigene klasse die den char pointer nach ansi standard kapselt (der stl string is auf vielen embedded systemen nich vorhanden)
bei den mainstream systemen (win mac linux) is der stl string die beste wahl
-
CString wurde zu einer Zeit entwickelt, als es die C++-Klasse string noch nicht im Standard gab. Prinzipiell sollte man immer std::string verwenden, da es alle notwendigen Funktionen bereit hält.
-
Erhard Henkes schrieb:
CString wurde zu einer Zeit entwickelt, als es die C++-Klasse string noch nicht im Standard gab. Prinzipiell sollte man immer std::string verwenden, da es alle notwendigen Funktionen bereit hält.
Kann man nicht so verallgemeinern. Wenn ein Programm schon "MFC-verseucht" ist dann sehe ich keinen Grund nicht CString zu benutzen. Die STL-Stringklasse finde ich nicht sonderlich gelungen. Man muss sich zuviele Sachen drum herum basteln (z.B. trim, replace etc.). CString gefällt mir von der "Bedienung" her schon besser. Bei neu gestarteten Projekten und wiederverwendbaren Klassen würde ich aber auch eher zum std::string tendieren und sie komplett MFC-frei halten.
-
komplett MFC-frei halten
Ich will dich ja nicht in die totalte Dunkelheit führen, Mastah, aber CString gibt es auch ohne MFC

(Wenn ich sehe, wie oft MFC-Unterstützung zu einem ATL- oder Consolen-Perojekt dazugefügt wird - und warum? "Na, wegen CString"....)
-
Habt ihr schnmal versucht einen std::string in einer DLL, welche eine ganze Klasse exportiert zu verwenden.
Ich hab es ohne Probleme nicht geschafft.Wenn man MFC verwendet kann man auch CString verwenden. MS hat diese Klasse optimiert.
Will man auch andere Plattformen dann hat man hier sowieso nichts verloren da MFC nicht verwendung finden kann.
-
Ich habe noch eine Frage, und zwar ist das erlaubt, bzw. in ordnung:
CString str = "Hallo!"; //irgendwas mit dem string machen, z.b. MessageBox(str)... str = "Welt"; //Wieder irgendwas machen.Darf man so immer wieder den Text ändern?
-
graf_double schrieb:
Ich habe noch eine Frage, und zwar ist das erlaubt, bzw. in ordnung:
CString str = "Hallo!"; //irgendwas mit dem string machen, z.b. MessageBox(str)... str = "Welt"; //Wieder irgendwas machen.Darf man so immer wieder den Text ändern?
natürlich.
-
Will man auch andere Plattformen dann hat man hier sowieso nichts verloren da MFC nicht verwendung finden kann.
Ha!
CString implementation based on basic_string

-
peterchen schrieb:
komplett MFC-frei halten
Ich will dich ja nicht in die totalte Dunkelheit führen, Mastah, aber CString gibt es auch ohne MFC

Ändert nichts an der Tatsache, dass du die MFC in meinen zukünftigen Projekten nicht mehr finden wirst. Und wenn ich die MFC nicht verwende dann verwende ich auch kein CString, da die Vorteile hinfällig werden.
-
da die Vorteile hinfällig werden
find ich nicht, aber ist vioelleicht geschmackssache (oder: welche Vorteile sind dir wichtig)
-
der fragesteller benutzt aber mfc und desshalb sollte er auch cstring verwenden
unix tom hat auch recht... std::string macht beim klassenexport per dll echte probleme