【问题标题】:Initialize members with deleted default constructor使用已删除的默认构造函数初始化成员
【发布时间】:2015-05-01 17:20:53
【问题描述】:

在 C++ 中,如果我想拥有一个没有默认构造函数的类的成员,我需要像这样显式初始化它:

class a
{
   a(int)
   {
   }
};

class b
{
   a x;

   b() : x(3)
   {
   }
};

但是,有时对 x 的初始化可能不是那么简单。它可能是一个非常复杂的公式,也可能是一个需要计算的带有 fors 和 ifs 的整体算法函数。我通常是这样解决的:

class b
{
   a * x;
   b()
   {
      // Do some very complicated computations
      this->x = new a(result_of_complicated_computations);
   }
};

然而,这迫使我在销毁的那一刻删除指针,它的性能稍差,并且使我的代码变得不整洁和丑陋。我真的很惊讶,没有办法在类的构造函数中计算成员的构造函数的参数,而不必使用这种技巧。

有没有更优雅的解决方案?

【问题讨论】:

  • 使用智能指针或一些附加功能
  • 为什么不能将复杂的计算转移到它自己的函数中,并使用该函数的输出创建 a 类型的对象,而不考虑堆分配的任何需要?

标签: c++ constructor member default-constructor


【解决方案1】:

使用辅助函数:

class b
{
    a x;
    b() : x(complicated_computation()) { }
private:
    static int complicated_computation() {
        return result_of_complicated_computations;
    }
};

并且默认构造函数没有被删除,而是未声明。

【讨论】:

    【解决方案2】:

    在函数中进行计算:

    static a complicated_computations();
    b() : x(complicated_computations()) {}
    

    【讨论】:

      【解决方案3】:

      我不明白。如果你有:

      class A
      {
      private:
          //a lot of members
      
      public:
          A(/* complex object used for construction */)
          : //initialize members
          { }
      }
      

      你可以这样做:

      class B
      {
      private:
          A a;
      
      public:
          B()
          : a(call_to_function_that_generates_this_complex_data())
          { }
      };
      

      您甚至可以在构造过程中使用您的成员函数。但请注意:

      § 12.6.2.13:

      成员函数(包括虚成员函数, 10.3) 可以为正在构造的对象调用。(...) 但是,如果这些操作是在 ctor-initializer(或函数中)执行的 在所有 基类的 mem-initializers 已经完成,结果 操作未定义。

      【讨论】:

        猜你喜欢
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-24
        • 2016-04-05
        • 2015-07-03
        • 2015-10-07
        • 1970-01-01
        相关资源
        最近更新 更多