85

一部の class への参照がありMyObjectますが、正確なオブジェクトは条件によって異なります。私はこのようなことをしたい:

MyObject& ref; 
if([condition]) 
  ref = MyObject([something]);
else 
  ref = MyObject([something else]);

コンパイラでは参照を宣言することはできても初期化することはできないため、現在これを行うことはできません。ここでの目標を達成するにはどうすればよいですか?

4

12 に答える 12

59

あなたはそれを初期化する必要があります。ただし、条件付きで初期化する場合は、次のようにすることができます。

MyObject& ref = (condition) ? MyObject([something]) : MyObject([something else]);
于 2013-02-14T20:03:05.497 に答える
22

私の知る限り、これは参照では実行できません。ポインタを使用する必要があります:

MyClass *ptr;

if (condition)
    ptr = &object;
else
    ptr = &other_object;

ポインターは参照と同様に機能します。->メンバー アクセスに使用することを忘れないでください。

于 2013-02-14T22:15:07.803 に答える
17

これはできません。参照は何かにバインドする必要があります。気に入らないかもしれませんが、null になる可能性のあるポインターとは異なり、参照がある場合は常に何かにバインドされていると想定できるため、クラス全体のエラーを防ぐことができます。

非 const 参照を無効な一時オブジェクトにバインドしようとするため、コード例はとにかく機能しません。

とにかく参照する必要があるのはなぜですか?1 つの解決策は、型に安価なデフォルト コンストラクターがあり、効率的に移動できることを確認してから、次のようにすることです。

MyObject obj; 
if([condition]) 
  obj = MyObject([something]) 
else 
  obj = MyObject([something else]);

それ以外の場合は、次のいずれかの条件付きコードを 1 つ以上の関数に配置する必要があります。

const MyObject& ref = createObject([condition]);

また

const MyObject& ref = [condition] ? doSomething() : doSomethingElse();

これらのバージョンは両方ともconst参照を使用することに注意してください。これは一時オブジェクトにバインドできます。オブジェクトが非 const でなければならない場合は、再び参照の使用を停止してください。

MyObject obj = createObject([condition]);

戻り値の最適化のおかげで、これはおそらくあなたがしようとしていたことと同じくらい効率的です

于 2013-02-14T20:30:24.267 に答える
12

簡単な答え:あなたはしません。

わずかに長い答え:次のようなことをしてください:

MyObject& getObject()
{
    if([condition]) 
        return [something] 
    else 
        return [something else];
}

MyObject& ref = getObject();

もちろん、参照に関する通常の免責事項が適用されます。

于 2013-02-14T20:12:03.477 に答える
12

C++ では、初期化せずに参照を宣言することはできません。初期化する必要があります。

于 2013-02-14T20:00:00.940 に答える
-1

if([条件]) MyObject& ref = MyObject([何か]); else MyObject& ref= MyObject([何か他のもの]);

于 2019-05-13T22:49:07.977 に答える