Arbeitet ihr mehr mit string oder CStrings?



  • Hi,

    ich bevorzuge es immer mit Strings der Standard-Bibliothek zu arbeiten und erst kurz vor einem Aufrufes einer Methode, die nur CStrings versteht, diese dann umzuwandeln. Wie macht ihr das, wenn ihr eine Klasse baut die Funktionen aufruft? Der Konstruktor von ofstream brauch ja auch einen CString für den Dateinamen. Legt ihr in eurer Klassen dann ein Char-Array fester Größe für den Dateinamen an, oder arbeitet ihr auch intern mit std::string und wandelt dann dort um, wo es notwendig ist?



  • Ich versuche, überall std::string zu verwenden, und ggf. zu konvertieren. Es gibt aber auch den Fall, dass ich kleine Modifikationen an bestehenden Modulen mache, die sowieso komplett mit char-Arrays (besser nicht CString dazu sagen, dass ist eine MFC/ATL-Klasse) arbeitet. Dann bleibe ich auch dabei und schreibe nicht alles um (einfach, weil dazu meist die Zeit fehlt). Und in unseren C-Modulen muss ich selbstverständlich immer mit char-Arrays arbeiten.

    Manchmal arbeite ich auch mit CString. Wir haben hier sowieso viel MFC, und die Klasse gefällt mir für viele Anwendungsfälle auch recht gut.



  • Butterbrot schrieb:

    Der Konstruktor von ofstream brauch ja auch einen CString für den Dateinamen.

    Seit C++11 nicht mehr.
    Das war aber auch meist die einzige Stelle, wo ich noch einen klassischen C string benötigte...



  • Butterbrot schrieb:

    Der Konstruktor von ofstream brauch ja auch einen CString für den Dateinamen.

    Seit C++11 nicht mehr. 🤡

    Spaß beiseite, ich verwende immer std::string für Member-Strings. Wenn man dann irgendwann eine Funktion mit einem C-String als Parameter aufrufen muss, einfach c_str() benutzen und fertig.



  • meistens mit std::strings, für statische Konstanten allerdings auch oft mit char*. Aktuell habe ich aber z.B. eine Situation, wo ich weder das eine noch das andere benutze: alle Strings in dem Modul sind konstant und werden bei der Initialisierung mit übergeben. Das geschieht dann so, dass ich den Inhalt aller strings als ein einziges großes char-Array übergebe, die (ziemlich kleine) ConstString-Klasse besteht dann aus einem Pointer und einer Längenangabe.



  • Ok danke, dann bin ich doch nicht so verrückt. Zeit habe ich genug, da ich nur zum Spaß programmiere.

    Ich biete, bis jetzt, in meinen eigenen Klassen immer zwei Möglichkeiten an. C++-Strings und Char-Array, falls die Objekte darin Char-Arrays brauchen, intern arbeite ich aber immer mit den C++-Strings. Ist zwar ein Overhead, aber ich kann, dank der vielen Methoden der C++-Stings, mit denen einfach besser arbeiten.



  • Nimm lieber immer entweder const char* oder const std::string&, das macht viele Klassen übersichtlicher. (Insbesondere wenn du 2 Parameter hast, und da auch noch alle Kombinationen anbieten willst.) Und dann würde ich zu const std::string& greifen, wenn du nicht einen guten Grund für das andere hast. Der Overhead entsteht ja nur ein mal, wenn der string erstellt wird. Und damit ist das bei den meisten (Desktop-) Programmen vernachlässigbar.



  • Ja, haste Recht das macht Sinn. An die Kombinationen, wenn mal mehr als einen Parameter habe, hatte ich nicht gedacht. Der Overhead ist bei meinen Programmen meist egal und wenn dann sind es nur ein paar Prozent, die wirklich genauer auf Geschwindigkeit Beachtung verdienen.

    Das wichtigste für mich ist immer noch Übersichtlichkeit, die Wahl der richtigen Algos und dass ich Fehler gut finde. Da ich nicht immer programmiere, sondern auch noch Grafik und Musik mache, muss ich in ein paar Wochen auch noch auf einen Blick meinen Code verstehen können.

    Lieber fünf Objekte mehr, an den Stelle wo Performance eh egal ist, und dafür easy nachzuvollziehen, als alles in eine Zeile quetschen.


Log in to reply