使用已删除的默认构造函数初始化成员

时间:2015-05-01 17:20:53

标签: c++ constructor member default-constructor

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

然而,这迫使我在破坏时删除指针,它的性能稍差,并使我的代码显得凌乱而丑陋。我真的很惊讶,没有办法在类的构造函数中为成员的构造函数计算参数,而不必使用这种技巧。

对此有更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:4)

使用帮助函数:

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

并且默认构造函数未被删除,但未声明。

答案 1 :(得分:0)

在函数中进行计算:

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

答案 2 :(得分:0)

我不明白。如果你有:

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(或函数)中执行的   在所有之前直接或间接地从ctor-initializer调用   基类的mem-initializers已经完成,结果是   操作未定义。