Warum sind C ++ 11-String neue Funktionen (stod, stof) nicht Member-Funktionen der String-Klasse?

7

Warum sind diese neuen C ++ 11 Funktionen des Headers <string> ( stod , stof , stoull ) nicht Memberfunktionen der Klasse string ?

Ist C ++ nicht mehr kompatibel mit mystring.stod(...) anstatt mit stod(mystring,...) ?

?     
Greg82 29.01.2014, 09:28
quelle

3 Antworten

22

Es ist eine Überraschung für viele, aber C ++ ist nicht eine objektorientierte Sprache (anders als Java oder C #).

C ++ ist eine Sprache mit mehreren Paradigmen und versucht daher, immer das beste Werkzeug für den Job zu verwenden. In diesem Fall ist eine free-function das richtige Werkzeug.

Richtlinie : Nichtmitglied-Nicht-Freund-Funktionen den Memberfunktionen vorziehen (aus Efficient C ++, Item 23)

Grund : Eine Memberfunktion oder eine Friend-Funktion hat Zugriff auf die Klasseninterna, während eine Nicht-Member-Nicht-Friend-Funktion dies nicht tut. Daher erhöht die Nicht-Member-Nicht-Freundes-Funktion die Kapselung .

Ausnahme : Wenn eine Elementfunktion oder eine Friend-Funktion einen signifikanten Vorteil bietet (z. B. Leistung), ist es trotz der zusätzlichen Kopplung sinnvoll, darüber nachzudenken. Zum Beispiel, obwohl std::find wirklich gut funktioniert, stellen assoziative Container wie std::set eine Member-Funktion std::set::find zur Verfügung, die in O (log N) statt in O (N) funktioniert.

    
Matthieu M. 29.01.2014, 09:37
quelle
3

Der Hauptgrund ist, dass sie nicht dorthin gehören. Sie habe eigentlich nichts mit Saiten zu tun. Halt und denke nach darüber. Benutzerdefinierte Typen sollten denselben Regeln folgen wie integrierte Typen, also jedes Mal, wenn Sie einen neuen Benutzertyp Sie müssten eine Funktion zu std::string hinzufügen. Das würde tatsächlich in C ++ möglich: wenn std::string ein Mitglied hat Funktion Vorlage to , ohne eine generische Implementierung, Sie könnte für jeden Typ eine Spezialisierung hinzufügen und aufrufen str.to<double>() oder str.to<MyType>() . Aber ist das wirklich ? was du willst. Es scheint mir keine saubere Lösung zu sein, Jeder, der eine neue Klasse schreibt, muss hinzufügen eine Spezialisierung auf std::string . Putting diese Art von Dingen in der String-Klasse Bastard es, und ist wirklich das Gegenteil von dem, was OO versucht zu erreichen.

Wenn Sie auf reinem OO bestehen würden, müssten sie es sein Mitglieder von double , int usw. (Ein Konstruktor, wirklich. This ist das, was Python zum Beispiel macht.) C ++ besteht nicht auf reinem OO und erlaubt keine Basistypen wie double und int habe Mitglieder oder spezielle Konstrukteure. So sind freie Funktionen beides eine akzeptable Lösung und die einzige saubere Lösung im Kontext der Sprache möglich.

FWIW: Konvertierungen zu / von Textdarstellung sind immer ein heikles Problem: Wenn ich es im Zieltyp mache, dann habe ich eine Abhängigkeit von den verschiedenen Quellen und Senken von Text eingeführt im Zieltyp --- und diese können in der Zeit variieren. Wenn ich es mache der Quell- oder Senktyp, ich mache sie abhängig vom Typ umgewandelt werden, was noch schlimmer ist. Die C ++ Lösung ist zu Definieren Sie ein Protokoll (in std::streambuf ), in das der Benutzer schreibt eine neue freie Funktion ( operator<< und operator>> ) zu handhaben die Konvertierungen und zählt auf Operator Overload Resolution zu finde die richtige Funktion. Der Vorteil der freien Funktion Die Lösung besteht darin, dass die Konvertierungen weder Teil der Daten sind Typ (der also nicht von Quellen und Senken wissen muss) der Source- oder Sink-Typ (den man also nicht kennen muss) benutzerdefinierte Datentypen). Es scheint die beste Lösung zu sein mich. Und Funktionen wie stod sind nur Komfortfunktionen, was einen besonders häufigen Gebrauch einfacher zu schreiben macht.

    
James Kanze 29.01.2014 10:37
quelle
1

Tatsächlich sind sie einige nützliche Funktionen und sie müssen nicht innerhalb der Hauptklasse sein. Ähnliche Dienstprogrammfunktionen wie atoi, atof sind innerhalb von stdlib.h definiert (aber für char *) und sie sind auch eigenständige Funktionen.

    
Varo 29.01.2014 09:43
quelle

Tags und Links