将新对象作为默认参数传递给构造函数

时间:2012-11-26 19:40:23

标签: c++ constructor arguments default-value

我有一个看起来像的构造函数:

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 个答案:

答案 0 :(得分:3)

您可以将const引用绑定到临时:

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

当然,这假设您要么将var2复制到成员中,要么在构造函数退出后不使用它。如果不是这种情况,那么您的设计就会出现问题。也许使用原始指针或shared/weak_ptr更合适。

答案 1 :(得分:1)

这样做很好的方法是为构造函数提供两个重载:

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>()));
}

然而,你的问题比它的外观要糟糕得多。你在第二次重载中所拥有的是非常可怕的,因为它会导致内存泄漏 - 你需要deletenew的所有内容,但现在你已经丢失了new编辑的内容。你只需要这样做:

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

除非必须,否则请勿使用new - 更喜欢自动存储时间。