2012-03-27 11 views
0

私は現在、(私は私の実際のコードを投稿することはできません)私は、次の同等を達成する必要があるクラスを持っている:関数呼び出し結果を使用して、C++ 03で複数のメンバーを初期化しますか?

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]) 
    {} 
}; 

問題はsplitDataが高価であるということである、と私はそれを実行したいと思います一度。通常、結果をコンストラクタ本体のローカル変数に格納しますが、この場合、メンバーの多くはデフォルトでコンストラクタブルではないため、イニシャライザリストで初期化する必要があります。

私はC++ 11私は私の問題を解決するための委任コンストラクタを使用することができますで知っている:

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]) 
    {} 
}; 

しかし、私はC++ 03でそれを行うにはどのような方法を把握することはできません。

答えて

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

これがチェックされていない、私は携帯電話でよ...

** UPD **いいえ、それは動作しません。新しい試み:

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

私はこの回答の変形を使用してしまいました。私はSplitResultのインスタンスを格納する必要がないため、初期化後は決して触れませんでした。ありがとう! – rkjnsn

4

どのようにあなただけの初期化に使用するメンバーsplit_resultを作りについて:

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]) 
    {} 
}; 

ちょうどそれが最初に初期化されるので、あなたは、他のメンバーの前にそれを宣言してください。メンバーの初期化順序は、クラス内で定義されている順序によって決まります。

+0

+1これは素晴らしいトリックです。 –

関連する問題