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.
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.
Tags und Links c++ c++11 non-member-functions