Ich möchte eine unveränderbare Datenstruktur erstellen, die zB aus einer Datei initialisiert werden kann.
%Vor%Was ich tun könnte, um das Problem zu beheben, ist
%Vor%Jedoch
Also die einzige Lösung, an die ich gedacht habe, ist die von
%Vor% Gibt es eine bessere Idee? (In Java
, Sie dürfen final
s im Konstruktor initialisieren.)
Sie können die Konstante im Konstruktor wegwerfen:
%Vor%Das würde erreichen, was Sie tun wollen, aber ich muss sagen, dass ich mich persönlich davor hüten würde und alle öffentlichen Datenmitglieder fürchten würde (zumindest in Bezug auf Ihr spezielles Beispiel). Ich würde mit Georgs Ansatz gehen oder die Daten privat machen und nur den Getter bereitstellen.
Sie könnten width
und height
in einen Typ verschieben und den Initialisierungscode in eine Initialisierungshilfsfunktion verschieben:
Sie können einfach das NamedConstructor
idiom hier verwenden:
Einer der Hauptvorteile von Named Constructors ist ihre Offensichtlichkeit: Der Name zeigt an, dass Sie Ihr Objekt aus einer Datei bauen. Natürlich ist es etwas ausführlicher:
%Vor%Aber das hat mich nie beunruhigt.
Wenn es C ++ 0x wäre, würde ich das empfehlen (Konstruktoren delegieren):
%Vor%Zuerst sollten Sie verstehen, dass der Konstruktor-Body nur für die Ausführung von Code zu complete verwendet wird, um Ihr Objekt als Ganzes zu initialisieren; Die Mitglieder müssen vollständig initialisiert werden, bevor der Körper betreten wird.
Ergo, alle Member werden in einer (impliziten, wenn nicht explizit angegebenen) Initialisierungsliste initialisiert. Natürlich müssen const
Variablen in der Liste initialisiert werden, da sie nach der Eingabe des Körpers bereits initialisiert werden sollen; Sie würden einfach versuchen, sie zuzuordnen.
Im Allgemeinen haben Sie const
Mitglieder nicht. Wenn Sie möchten, dass diese Mitglieder unveränderlich sind, geben Sie ihnen keinen öffentlichen Zugang, der sie verändern könnte. (Wenn Sie const
members haben, wird Ihre Klasse nicht zuweisbar, normalerweise unnötig.) Wenn Sie diese Route verwenden, wird Ihr Problem leicht behoben, da Sie ihnen einfach Werte im Konstruktor des Konstruktors zuweisen, wie Sie es wünschen.
Eine Methode, um das zu tun, was Sie wollen, während const
beibehalten könnte:
Ich denke nicht, dass diese Route es wert ist.
Sie sollten Inline-Getter für die Breite und Höhe anstelle von öffentlichen const-Elementvariablen hinzufügen. Der Compiler wird diese Lösung so schnell wie die ursprüngliche versuchen.
%Vor%PS .: Ich habe am Ende private Dinge geschrieben, weil sie für den Benutzer der Klasse weniger wichtig sind.
Wie geht es mit der Übergabe von MetaData als Argument an den Konstruktor? Dies bietet viele Vorteile:
a) Die Konstruktorschnittstelle macht die Abhängigkeit von MetaData deutlich. b) Es erleichtert das Testen der Image-Klasse mit verschiedenen Arten von MetaData (Unterklassen)
Also würde ich wahrscheinlich ähnlich wie folgt vorschlagen:
%Vor%Dies ist einer meiner am wenigsten bevorzugten Aspekte von C ++ im Vergleich zu Java. Ich werde ein Beispiel verwenden, an dem ich gearbeitet habe, als ich dieses Problem lösen musste.
Was folgt, ist das Äquivalent einer readObject-Methode. Es deserialisiert einen Videoschlüssel aus einem bereitgestellten Dateipfad.
%Vor%Tags und Links const c++ constructor