Initialisierung von C ++ const-Feldern nach dem Konstruktor

7

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

  1. Es zwingt mich, MetaData als ein Feld in meinem Objekt zu speichern. Was ich nicht immer will.
  2. Manchmal ist die Logik im Konstruktor viel komplexer als ein einzelner Lesevorgang (z. B. kann die Fehlerbehandlung ein paar Zeilen dauern)

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.)

    
Elazar Leibovich 12.08.2010, 06:43
quelle

10 Antworten

2

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.

    
celavek 12.08.2010, 09:18
quelle
11

Sie könnten width und height in einen Typ verschieben und den Initialisierungscode in eine Initialisierungshilfsfunktion verschieben:

%Vor%     
Georg Fritzsche 12.08.2010 06:50
quelle
6

Sie können einfach das NamedConstructor idiom hier verwenden:

%Vor%

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.

    
Matthieu M. 12.08.2010 08:56
quelle
4

Wenn es C ++ 0x wäre, würde ich das empfehlen (Konstruktoren delegieren):

%Vor%     
M. Sadeq H. E. 12.08.2010 09:44
quelle
2

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:

%Vor%

Ich denke nicht, dass diese Route es wert ist.

    
GManNickG 12.08.2010 06:55
quelle
1

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.

    
Notinlist 12.08.2010 07:12
quelle
0

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%     
Chubsdad 12.08.2010 07:40
quelle
0

Ich würde eine statische Methode verwenden:

%Vor%     
Frank Osterfeld 12.08.2010 07:50
quelle
0
%Vor%

Soweit ich weiß, wird dieser Mechanismus funktionieren.

    
indrajit 12.08.2010 10:19
quelle
0

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%     
HesNotTheStig 23.02.2016 01:32
quelle

Tags und Links