2

私は次のようなコンストラクターを持っています:

RandomClass(const int16_t var1, const SecondClass& var2);

2番目のパラメーターにデフォルトの引数を渡す必要があるので、現在は次のようにしています。

RandomClass(const int16_t var1, const SecondClass& var2 = *(new SecondClass(*(new std::unordered_map<int16_t, double>())));

これは信じられないほど厄介です。オーバーロードされたコンストラクターを使用したり、2番目のパラメーターを参照からポインターに変更したりしたくないことに注意してください。

デフォルトパラメータを渡すエレガントな方法は何でしょうか?

4

2 に答える 2

3

const参照を一時的なものにバインドできます。

RandomClass(const int16_t var1, const SecondClass& var2 = SecondClass(std::unordered_map<int16_t, double>()));

もちろん、これはvar2、メンバーにコピーするか、コンストラクターの終了後にメンバーを使用しないことを前提としています。そうでない場合は、デザインに問題があります。おそらく、生のポインタまたはaを使用するshared/weak_ptr方が適切です。

于 2012-11-26T19:49:48.250 に答える
1

これをうまく行う方法は、コンストラクターに2つのオーバーロードを提供することです。

RandomClass(const int16_t var1, const SecondClass& var2)
{
  // ...
}

RandomClass(const int16_t var1)
{
  const SecondClass var2 = *(new SecondClass(*(new std::unordered_map<int16_t, double>()));
}

ただし、見た目よりもはるかに悪い問題があります。その2番目の過負荷であなたが持っているものは、メモリリークを引き起こすため、信じられないほど恐ろしいものです-あなたはdeleteあなたがすべてを必要としますnewが、今あなたはあなたがしたものの痕跡を失いましたnew。あなたは単にこれをするでしょう:

RandomClass(const int16_t var1)
{
  const SecondClass var2{std::unordered_map<int16_t, double>()};
}

必要がない限り使用しnewないでください-自動保存期間を優先します。

于 2012-11-26T19:51:43.597 に答える