- 締切済み
参照型変数を宣言と同時に初期化しない
参照型変数は、宣言と同時に初期化する必要があります。 宣言時には参照先が決定しておらず、条件によって動的に参照先を決定したい場合、どのように記述すれば良いでしょうか? ------------------------------------------------------------------- CMyClass& obj; // 条件によって異なるオブジェクトを参照したい switch (mode) { case A: obj = objA; // 外部で生成済みのオブジェクトへの参照 break; case B: obj = objB; break; ・・・ case X: obj = objX; break; } // 以下、mode共通の処理 obj.hogehoge(); ------------------------------------------------------------------- 三項演算子を入れ子にして一行に収めれば可能ですが、スマートではないし見た目にも良くありません。 CMyClass& obj = A ? objA : (B ? objB : objC);
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- FAY
- ベストアンサー率49% (95/193)
> 参照型変数は、宣言と同時に初期化する必要があります。 とおっしゃっているとおりです。 参照型は変数として宣言する場合は初期化子が必要で、 一度参照先が設定されると変更することができません。 なので、参照先を変えたい場合は初期化時に三項演算子で分岐するか、条件によって違う参照先を返すメソッドを作り、そのメソッドの戻り値をCMyClass& objに設定してやればいい気がします。 #ただ、示されてるサンプルでは参照型にする理由が私には見出せませんでした。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
妙にトリッキーなことするくらいなら、無理せずポインタ使った方がよくはないですか?
お礼
ご回答ありがとうございます。 現実的にはそうかも知れませんね。 参照を使いたい場面があるのですが、単にテクニック的な興味からの質問でもあります。
- maiko0333
- ベストアンサー率19% (839/4401)
NULLで初期化すればどうですか?
お礼
ご回答ありがとうございます。 NULLで初期化しようとするとC2440エラーが出ます。
お礼
>条件によって違う参照先を返すメソッドを作り、 まさにそうですね。参照を返す関数というのは思いつきませんでした。 サンプルは説明のために簡略化したまでで、実際は複雑なロジックの中の一部なのです。