2012-03-27 4 views
0

Im Moment habe ich eine Klasse, wo ich das Äquivalent der folgenden erreichen müssen (ich meine eigentliche Code schreiben kann):Verwenden Sie Funktionsaufruf Ergebnis, um mehrere Mitglieder in C++ 03 zu initialisieren?

class Data 
{ 
public: 
    Data(const std::string &data_string) 
     : member_1(splitData(data_string)[0]), 
     member_2(splitData(data_string)[1]), 
     member_3(splitData(data_string)[2]), 
     member_4(splitData(data_string)[3]), 
     member_5(splitData(data_string)[4]) 
    {} 
}; 

Das Problem ist, dass splitData teuer ist, und ich möchte, dass es nur laufen Einmal. Normalerweise würde ich das Ergebnis in einer lokalen Variablen im Rumpf des Konstruktors speichern, aber in diesem Fall sind viele der Elemente nicht standardmäßig konstruierbar, also muss ich sie in der Initialisierungsliste initialisieren.

Ich weiß, in C++ 11 konnte ich verwenden Konstrukteure delegieren mein Problem zu lösen:

class Data 
{ 
public: 
    Data(const std::string &data_string) 
     : Data(splitData(data_string)) // splitData only called once 
    {} 
private: 
    Data(const SplitResult &split_result) 
     : member_1(split_result[0]), 
     member_2(split_result[1]), 
     member_3(split_result[2]), 
     member_4(split_result[3]), 
     member_5(split_result[4]) 
    {} 
}; 

Aber ich kann keinen Weg herauszufinden, es zu tun in C++ 03.

Antwort

2
Data (const std::string data_string, 
      SplitResult split_result = split_data(data_string)) : 
    member_1(split_result[0]), 
     ... 

Diese nicht aktiviert ist, ich bin auf einem Handy ...

** UPD ** nein, es wird nicht funktionieren. Ein neuer Versuch:

Data (const std::string data_string, 
      SplitResult split_result = SplitResult()) : 
    member_1((split_result = split_data(data_string))[0]), 
    member_2(split_result[1]), 
     ... 
+0

Ich habe eine Variante dieser Antwort verwendet, die mir gefällt, weil sie mich nicht zwingt, eine Instanz von SplitResult zu speichern, die nach der Initialisierung niemals berührt würde. Vielen Dank! – rkjnsn

4

Wie über Sie split_result Mitglied machen gerade Sie für die Initialisierung verwenden:

class Data 
{ 
    SplitResult split_result; 
    //declare member_x here 
public: 
    Data(const std::string &data_string) 
     : split_result(splitData(data_string)), 
     member_1(split_result[0]), 
     member_2(split_result[1]), 
     member_3(split_result[2]), 
     member_4(split_result[3]), 
     member_5(split_result[4]) 
    {} 
}; 

So stellen Sie sicher, dass Sie es vor den anderen Mitgliedern erklären, so dass es zunächst initialisiert wird. Die Reihenfolge der Mitgliederinitialisierung wird durch die Reihenfolge bestimmt, in der sie in der Klasse definiert sind.

+0

+1, Dies ist ein schöner Trick. –

Verwandte Themen