Mehr eine benutzerdefinierte und Praxis-Frage, aber ist es als schlechte Form, oder stark zu empfehlen (wählen Sie Ihre Interpretation von Schlechtigkeit), die Verwendung von Qt-Bibliothekstypen und ähnliche Standard-C ++ - Typen in dem einen Programm zu mischen?
Ist es beispielsweise sehr ratsam, NUR QStrings für die Verwendung von Strings zu verwenden, oder mischt man häufig QString- und std :: string-Typen in der Quelldatei?
Ich habe etwas Code geerbt, der die Verwendung von QString und std :: string in der einen Datei enthält, und frage mich, ob ich alles in das eine oder das andere konvertieren soll.
Ich denke, es kommt darauf an, "es kommt darauf an, was Sie tun." Sicherlich ist es einfacher, die Dinge als nur einen Typ zu halten. Es kann jedoch vorkommen, dass Sie std :: strings übergeben oder QStrings übergeben müssen und es möglicherweise leistungsmäßig besser ist, die Konvertierung nicht durchzuführen.
Beachten Sie auch, dass QStrings nicht mit denen von std: strings identisch sind. Berücksichtigen Sie dies bei der Konvertierung zwischen ihnen (oder wählen Sie nur einen bestimmten Typ).
Überprüfen Sie diesen Blogeintrag , der STL
mit QTL und std::string
mit vergleicht QString
.
Meine 2 Cent
Es hängt wirklich davon ab, was Sie tun. Allgemein wenn ich etwas codiere wo Qt
nicht notwendig ist (zB eine Bibliothek) benutze ich immer STL
. Auf der anderen Seite, wenn ich Code für eine GUI-Anwendung schreibe, verwende ich lieber QTL
und QString
über STL
und std::string
. Wenn ich diesen Code in eine Bibliothek integrieren möchte, die mit STL
geschrieben wird, stelle ich überladene Funktionen bereit, die die Konvertierung von STL
nach QTL
und QString
nach std::string
vornehmen.
QStrings
sind ein Muss Wenn Sie Ihre Anwendung seit der Verwendung von tr()
und QLinguist
macht es kinderleicht.
Im Allgemeinen bevorzuge ich die Verwendung von QString
über std::string
und Qt Containern (wie QList
, ...) über std
Containern in Code, der eng an das Qt Framework gekoppelt ist, und würde es auch nicht tun Sinn machen ohne es. In allen anderen Komponenten (wie Hilfsbibliotheken und dergleichen) bevorzuge ich aus Gründen der Flexibilität den Standard C ++ - Weg.
Aber ich denke, das ist eher eine subjektive Entscheidung, da die Typen normalerweise recht einfach voneinander zu konvertieren sind (und Qt-Container bieten auch standardkonforme Iteratoren). Obwohl in Qt-zentrischem Code die Qt-Container möglicherweise besser funktionieren, insbesondere zusammen mit Qt's Meta-Objekt und Typ-System.
QStrings und C ++ - Strings lösen unterschiedliche Probleme - der Hauptunterschied besteht darin, dass QStrings explizit mit locales / encodings umgehen, während std :: strings dies nicht tut.
Verwenden Sie QStrings also für alle von Benutzern eingegebenen Daten und alle Zeichenfolgen, die Ihren Nutzern angezeigt werden, oder dass Sie beim Konvertieren von Kodierungen Informationen verlieren und / oder die Internationalisierung Ihrer App in Zukunft erschweren.
Für alles, wo ich gerade ein Char * Äquivalent benötige, z.B. Da ich Daten aus einer Datenbank gelesen habe, in der locales / encodings nicht anwendbar sind, verwende ich std :: strings, da sie viel einfacher mit Nicht-Qt-Bibliotheken zu verwenden sind und Ihre Daten nicht durch Codierungskonvertierungen umgesetzt werden. Sie müssen sie jedoch explizit zum qt-Typ-System hinzufügen, um sie in signal / slot-Argumenten verwenden zu können, was einfach ist, sobald Sie wissen, wie.
Aber am Ende ist es ein Urteilsspruch - nur um Ihre Codebasis für Neulinge zugänglicher zu machen, ist es vielleicht besser, QString überall zu verwenden, oder einfach nur std :: string überall, wenn Sie QtCore in einem nicht GUI-App.
Ich nehme an, es liegt an Ihnen, zu entscheiden. Beachten Sie, dass für die Konvertierung zwischen den beiden eine Kopie der Zeichenfolge erforderlich ist. Wenn also beide Konvertierungen erforderlich sind, ist die Leistung nicht gut: Lesen Sie beispielsweise QString::fromStdString und QString :: fromStdWString . Wenn Sie Qt verwenden, schätze ich, dass Sie möglicherweise nicht nur QString verwenden, und in diesem Fall erfordern die meisten Methoden der Qt-Klassen, dass Sie QString bereitstellen. Also, könnte schlecht für die Leistung und unangenehm zu schreiben sein.
Berücksichtigen Sie auch, dass std :: string leicht von Implementierung zu Implementierung variiert und std :: string copy-on-write möglicherweise eine andere Leistung zeigt.