【问题标题】:Passing new object as default argument to constructor将新对象作为默认参数传递给构造函数
【发布时间】:2012-11-14 08:18:13
【问题描述】:

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

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 个重载而不是默认值。
  • 您当前的方法不仅不优雅,还会造成内存泄漏——那些news 没有与deletes 配对。

标签: c++ constructor arguments default-value


【解决方案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>()));
}

但是,您遇到的问题比看起来要糟糕得多。你在第二次重载中所拥有的东西非常可怕,因为它会导致内存泄漏 - 你需要 delete new 的所有内容,但现在你已经失去了 newed 的任何痕迹。您只需这样做:

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

除非必须,否则不要使用new - 更喜欢自动存储持续时间。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,这看起来好多了。内存泄漏安全吗?
    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2011-06-28
    • 2011-06-12
    • 2016-04-21
    相关资源
    最近更新 更多