Vorlagen für die setter und Getter
Ich bin nicht vertraut mit Vorlagen, aber ich Frage mich, ob es möglich ist, verwenden Sie für setter-und getter-Methoden. Zum Beispiel in dieser situation:
double exmlClass::getA(void) const
{
return a_;
}
void exmlClass::setA(const double& a)
{
a_ = a;
}
double exmlClass::getB(void) const
{
return b_;
}
Wie Sie sehen können, die Methoden sind fast die gleichen, außer Sie beziehen sich auf eine andere private Variablen (a_, b_, c_). Gibt es eine elegantere Art und Weise zu schreiben, die diese Funktionen, oder ist es üblich, zu tun, wie oben in solchen Situationen? Und wenn seine häufige Verwendung von Vorlagen, würde ich schätzen Beispiel, wie Sie verwenden würden, die im code oben.
Andere Frage, die ich stellen würde, ist, wie sollten Getter und setter werden entsprechend deklariert. Ist es guter Programmierstil?
double getA(void) const;
void setA(const double& a);
double getB(void) const;
void setB(const double& b);
double getC(void) const;
void setC(const double& c);
Meine ich, sollten Getter werden immer const-und Set-Methoden nehmen Sie als argument die Referenz auf ein Objekt, anstatt es zu kopieren, das wäre wahrscheinlich ein bisschen langsamer?
- Wenn Sie die Klasse Getter und setter in Mengen, dass das ein Thema ist, würde ich ernsthaft Frage sein design.
- und dann einige
- Ich Stimme mit @sbi zu einem Punkt. Wie, der Artikel anspielt, wenn Sie mit setter und Getter für den alleinigen Zweck der Zugriff auf etwas eigenes, dann ist es albern. Es gibt jedoch eine situation, die Artikel nicht berühren: wenn Sie einen legitimen benötigen, um die Behandlung von privaten Daten als semi - oder vollständig undurchsichtig (endianness, Serialisierung/de-Serialisierung ein paar zu nennen), vor allem, wenn der Typ dargestellt wird, umschließt mehr als ein Stück von Daten. Beispiel: codereview.stackexchange.com/questions/7786/...
- Auch, da der Autor dieses Artikels nicht spell it out (es ist nur kurz erwähnt wird, nahe dem Ende), möchte ich etwas hervorheben aus dem Artikel:
3. A lack of essential operators and other methods forces user programs to manipulate the object through the get and set accessor functions.
Wenn Ihr Accessoren sind die Operatoren, dies impliziert zumindest der Autor dieses Artikels würde nicht [unbedingt] haben die gleiche Beschwerde. - Gut, die OP ist dumme Getter und fragt, Ist es guter Programmierstil? Das ist ein sehr zuverlässiges Zeichen für einen newbie streunen vom Pfad der Wahrheit(™), anstatt jemand zu Fragen, Abstraktion, Weg einige Implementierungsdetails hinter Getter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haro der Neinsager!
Boost.Fusion.Anzeigen ist, was Sie suchen, als Grundlage.
design Ihre Programme in einer Weise, dass es weniger Bedarf für Getter und setter.
Sie könnte erstellen Sie ein makro oder implementieren eine Art von propertysyntax(das ist möglich, aber es gibt immer Dinge, die nicht richtig funktionieren)..
Aber ich nehme an, schreiben nur die Zugriffsmethoden, wenn Sie benötigt werden, oder generieren Sie mit Ihrer IDE ist die beste und übliche Weg.
Als für Ihre zweite Frage, Sie sollten es verwenden, zumindest für den Objekt-Typ, die Sie nicht wirklich brauchen es für die "primitiven". Ich persönlich benutze es nicht, entweder wenn ich eine Kopie des Objekts, das sowieso, aber andere können behaupten, dass es besser sein könnte, dies zu tun, explizit.
typedef
. Erstellen einer undurchsichtigen Typ, nur weil Sie vielleicht ändern müssen, die zugrunde liegende Implementierung ist eine form von falscher Faulheit: c2.com/cgi/wiki?FalseLazinessKann ich nicht sehen, eine Möglichkeit für Template direkt zu helfen Sie compactify Ihre getter - /setter-Paare, es sei denn, Sie möchten, wickeln Sie Ihre Mitglieder in Vorlagen-accessor-Klassen, wie diese. Eine andere Möglichkeit ist die Verwendung einer #define-makro zu emulieren C# - Eigenschaften (wenn Makros nicht erschrecken Sie oder jemand, der das Lesen des Codes).
Ob Ihr get return (const) Referenzen an die Mitglieder, return-Pointer an die Mitglieder, oder kopieren Sie Sie, hängt von einigen Faktoren ab. Sie haben zu prüfen, ob es ist teuer, Sie zu kopieren (performance-wise), ob es semantisch Sinn macht, um Sie zu kopieren, und ob es möglich sein soll für die Informationen, die Sie zurückgeben, um zu überleben, die Klasse sind Sie immer aus (wenn Sie die Rückgabe eines Zeigers/Referenz an ein Mitglied, es wird Links hängen, sobald Sie Sie löschen Ihr Objekt). Und ich würde die Verwendung von Zeigern über Referenzen, wenn Sie möchten, dass für die Möglichkeit der Mitgliedstaaten null.
Für Getter, tendiere ich zur Rückgabe const-Referenzen für nichts, aber primitive, die ich kopiere. Für setter, es ist üblich, haben eine const Referenz-parameter.
Es technisch möglich ist, erstellen Sie eine einzelne
exmlClass::set<PMF>
Funktion Vorlage so, dassexmlClass::set<&exmlClass::a_>
gültig ist. Aber was würde der Punkt sein?Nein, Sie kann nicht definieren, jede Art von Vorlage, die Erstellung von Funktionen oder eine Funktion-wie die Dinge mit einer eingegrenzten Gruppe von Namen wie
getA
,getB
, ....Einem makro könnte es tun, aber das ist eine noch schlechtere Idee.
Ich in der Regel pass/return ein Objekt der Klasse, die von const-Referenz, aber einfache built-in-Typen wie
double
nur von Wert:In der Theorie, Sie könnte:
Gibt es mehrere Probleme, die ich mit dieser. Erstens ist, dass Getter/setter sollte nicht "Abstrakt" in dem, was Sie vermitteln den Nutzern Ihrer Klasse. Was werden Sie tun, rufen Sie diese Getter/setter? getA() ? getAValue()? Was bedeutet das überhaupt?
Zweitens, diese definiert 3. Wie viele Sie benötigen für Ihre Objekte? 1, 2, 4, 9?
Drittens, Get - /Set-Methoden sollten benannt werden entsprechend Ihrer Funktion in:
Es klingt wie Sie wollen nur sparen Sie auf Eingabe, nie eine Ausrede, um zu erschweren das design imho.
Bezug zu Ihrem 2. Punkt, return Referenz auf Objekte (const, vorzugsweise), aber nicht die Mühe mit klein -, integral-POD (Plain-Old-Data) Datentypen wie int, char, bool etcteras.