-->

没有默认构造函数的类成员(Class member without a default constr

2019-06-28 00:26发布

假设我有一个A类没有默认构造,返回类型A的对象的工厂方法factoryA,并具有作为其成员的类B中。 我知道,在这种情况下,B的A类成员在B的构造函数初始化列表中被初始化。 这是不完全清楚,我为什么那么,如果有人可以解释,对我来说将是巨大的。 此外,如果需要B的构造函数内进行计算的参数A的构造函数,通过查询性质的数据库或者说点什么? 有没有办法使用下面的设置,但不提供一个默认的构造函数的方法吗? 提前致谢。

class A {
private:
  int _i;
public:
  A(int i) : _i(i) {} 
};

A factoryA(bool b) {
  if(b)
    return A(1);
  else return A(2);
}

class B {
private:
  A _a;
public:
  B(int j) {
    if(j > 0)
      _a = factoryA(true);
    else _a = factoryA(false);
  }
};

Answer 1:

成员对象的构造函数的进入体(大括号之间的部分)之前总是初始化。 如果你不提在初始化列表中的成员,它就会被默认的构造。 所以,别提了!

B::B(int j) : _a(factoryA(0 < j)) { };

这将调用函数factoryA与参数值true如果j大于0和false ,否则,并初始化成员_a与该调用返回的值。



Answer 2:

这是不完全清楚,我为什么那么,如果有人可以解释,对我来说将是巨大的。

对于类[*],所述_a = factoryA(true); 行调用_a.operator=(factoryA(true)) 调用一个成员函数_a需要_a已被初始化。 所以,如果它不是一个编译时错误,它仍然是无效的。

此外,如果需要B的构造函数内进行计算的参数A的构造函数,通过查询性质的数据库或者说点什么? 有没有办法使用下面的设置,但不提供一个默认的构造函数的方法吗?

只要A有复制或移动构造函数,你可以用一个函数的返回值初始化它,该功能可以做任何你想要的,即使使用不同的构造为A根据提供的参数。

class B {
private:
  A _a;
  static A getA(int i);
public:
  B(int j) : _a(getA(j)) {
  }
};

A B::getA(int j)
{
  if (j > 0)
    return factoryA(true);
  else
    return factoryA(false);
}

[*]我知道,也有例外。



Answer 3:

在这种情况下,最好使用指针A,即A * _a,然后调用构造函数,无论你想。



文章来源: Class member without a default constructor