Ich bin nicht vertraut mit Vorlagen, aber ich frage mich, ob es möglich ist, sie für Setter-und Getter-Methoden zu verwenden. Zum Beispiel in dieser Situation:
%Vor%Wie Sie sehen, sind die Methoden fast identisch, außer dass sie sich auf eine andere private Variable beziehen (a_, b_, c_). Gibt es eine elegantere Art, diese Funktionen zu schreiben, oder ist es üblich, in solchen Situationen wie oben zu tun? Und wenn es üblich ist, Vorlagen zu verwenden, würde ich mich über ein Beispiel freuen, wie Sie sie im obigen Code verwenden würden.
Eine andere Frage, die ich stellen möchte, ist, wie Getter und Setter richtig deklariert werden sollen. Ist es ein guter Codierungsstil?
%Vor%Ich meine, sollten Getter immer const sein und Setter als Argument einen Verweis auf ein Objekt nehmen, anstatt es zu kopieren, was wahrscheinlich ein bisschen langsamer wäre?
Haro den Neinsagern!
Boost.Fusion.Map ist was Sie suchen als Basis.
%Vor%Gestalten Sie Ihre Programme so, dass Getter und Setter weniger benötigt werden. Du könntest sie durch ein Makro erstellen oder eine Art Propertysyntax implementieren (was möglich ist, aber es gibt immer Dinge, die nicht richtig funktionieren). Ich schätze jedoch, dass das Schreiben der Accessoren, wenn sie benötigt werden, oder das Generieren mit der IDE der beste und üblichste Weg ist.
Was Ihre zweite Frage anbelangt, sollten Sie sie zumindest für den Objekttyp verwenden, Sie brauchen sie nicht wirklich für Primitive. Persönlich verwende ich es auch nicht, wenn ich eine Kopie des Objekts benötige, aber andere behaupten vielleicht, dass es besser ist, dies explizit zu tun.
Ich kann keinen Weg für Templating sehen, der Ihnen hilft, Ihre Getter / Setter-Paare direkt zu komprimieren, es sei denn, Sie möchten Ihre Member in Templated Accessor-Klassen wie dies . Eine andere Möglichkeit besteht darin, ein #define-Makro zu verwenden, um C # -Eigenschaften zu emulieren (wenn Makros Sie nicht erschrecken oder wenn jemand Ihren Code liest).
Ob Ihre Getter (const) Referenzen auf Mitglieder zurückgeben, Zeiger auf Mitglieder zurückgeben oder sie kopieren, hängt von einigen Faktoren ab. Sie müssen überlegen, ob es teuer ist, sie zu kopieren (performance-weise), ob es semantisch sinnvoll ist , sie zu kopieren und ob die Informationen, die Sie zurückgeben, die Klasse übertreffen können (Wenn Sie einen Zeiger / Verweis auf ein Mitglied zurückgeben, wird es hängen bleiben, sobald Sie Ihr Objekt löschen). Und ich würde Zeiger auf Referenzen verwenden, wenn Sie die Möglichkeit zulassen möchten, dass das Mitglied null ist.
Für Getter tendiere ich dazu, Const-Referenzen für alles andere als Primitive zurückzugeben, die ich kopiere. Für Setter ist es üblich, einen konstanten Referenzparameter zu haben.
Nein, Sie können keine Art von Vorlage definieren, die Funktionen oder funktionsähnliche Dinge mit einem unbegrenzten Satz von Namen wie getA
, getB
, ....
Ein Makro könnte es tun, aber das ist eine noch schlimmere Idee.
Normalerweise gebe / gebe ich ein Klassenobjekt durch const-Verweis zurück, aber einfache integrierte Typen wie double
nur nach Wert:
Theoretisch könnten Sie:
%Vor%Es gibt mehrere Probleme, die ich damit sehe. Erstens sollten Getter / Setter nicht "abstrakt" sein in dem, was sie den Benutzern Ihrer Klasse vermitteln. Wie werden Sie diese Getters / Setter nennen? getA ()? getAValue ()? Was bedeutet das überhaupt?
Zweitens, das definiert 3. Wie viele brauchen Sie für Ihre Objekte? 1, 2, 4, 9?
Drittens sollten Getter / Setter entsprechend ihrer Funktion benannt werden:
%Vor%Es klingt, als ob Sie nur beim Tippen sparen möchten, niemals eine Entschuldigung, um Ihr Design zu verkomplizieren.
In Bezug auf Ihren zweiten Punkt, geben Sie Bezug auf Objekte zurück (const, vorzugsweise), aber kümmern Sie sich nicht um kleine, integrale POD (Plain-Old-Data) Typen wie int, char, bool etcteras.