2012-01-24 10 views
2

は、私たちは、ヒープオブジェクトで次の操作を行うことができます知っている:スタックオブジェクトのレイジー初期化?

/* Heap objects */ 
Pet *pet; 

if (...) 
    pet = new Pet("Dog"); 
else 
    pet = new Pet("Cat");  

しかし、我々は、スタック上で宣言するPetオブジェクトを望んでいたならば、我々はそれをどのように行うのですか?

/* Stack objects */ 
Pet pet; 

if (...) 
    -?- 
else 
    -?- 

答えて

3

以下

Pet pet(theCondition ? "Dog" : "Cat"); 

または条件ブロックは、単一の初期ストア

const char* pArgument; 
if (...) { 
    ... 
    pArgument = "Dog"; 
} else { 
    ... 
    pArgument = "Cat"; 
} 

Pet pet(pArgument); 
+0

しかし、それは、より複雑な場合-else文の場合は? –

+0

@LeifEricsonはちょっと前にもっと複雑なバージョンを追加しました – JaredPar

3
string param; 
if (...) 
    param = "Dog" 
else 
    param = "Cat"; 

Pet pet(param); 
1
別個ローカルとして初期化するために使用される const char*よりも複雑であるかを試します

遅延初期化は明らかにベースオブジェクト自体によって行われる必要があります。

if (...) 
    animal.Initialize("Dog"); 
else 
    animal.Initialize("Cat"); 

オブジェクトは、派生クラスで記入する必要のある仮想メソッドを持っている場合、これは動作しません - その場合にはポインタが唯一の実行可能なソリューションです。

0

私はスタックオブジェクトと同じことができないと思います。

しかし、ここでいくつかの選択肢があります:

/* Stack objects */ 

if (...) 
{ 
    Animal animal("Cat"); 
    ... 
} 
else 
{ 
    Animal animal("Dog"); 
    ... 
} 

そう怠惰
Animal cat("Cat"); 
Animal dog("Dog"); 
Animal *animal; 

if (...) 
{ 
    animal = &cat; 
} 
else 
{ 
    animal = &dog; 
} 
+1

あなたの最初の解決策は、それらのオブジェクトがif-elseの外には存在しないために、良くありません。 –

+0

しかし、あなたはそれを聞いていませんでした。 – frast

1

あなたのクラスは、デフォルトの構築をサポートし、割り当てをコピーすると、次のように動作します:

Pet pet; //- assumes Pet class supports default construction. 

if (theCondition) 
{ 
    pet = Pet("Dog"); //- assumes Pet class supports copy assignment. 
} 
else 
{ 
    pet = Pet("Cat"); 
} 

もちろん、あなたは2つの建築物とあなたのPEを置く特権のためのコピーを支払う必要がありますスタック上のt。

0

もう一つのオプションは、機能を使用することで、またはC++ 11、ラムダで:

auto returnArg = [&]() -> const char * { 
    if (...) return "Dog"; 
    else return "Cat"; 
}; 

Animal animal(returnArg()); 
0

ブレイク2つの段階にスタックのローディング。

void doTheThingToTheAnimal(Animal& animal) { 
    ... 
} 


// select the animal 
if (...) { 
    Animal animal("Dog"); 
    doTheThingToTheAnimal(animal); 
} else { 
    Animal animal("Cat"); 
    doTheThingToTheAnimal(animal); 
} 
1

boost::optionalは(さえコンテナ用)遅延初期化を取得するために使用することができます。

boost::optional<Animal> d; 
if(foo) d = Animal("Dog");