委托构造函数进行内部成员初始化

时间:2014-11-11 14:12:35

标签: c++ c++11

我想做以下事情:

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass()
    :
    DelegatingCTorPlusInClass(m_a, m_b) // m_a and m_b are "random"
  {
  };

  DelegatingCTorPlusInClass(int a)
    :
    DelegatingCTorPlusInClass(a, m_b) // m_b is "random"
  {
  };

  DelegatingCTorPlusInClass(const std::string &b)
    :
    DelegatingCTorPlusInClass(m_a, b) // m_a is "random"
  {
  };

  DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a),
    m_b(b)
  {
    // DO THINGS
  };

private:
  int m_a = 42;
  std::string m_b = "42";
};

但是,从一个构造函数传递到另一个构造函数的成员尚未初始化,因此基本上是“随机的”。我怎么能实现类似的东西?

3 个答案:

答案 0 :(得分:1)

[class.base.init]/9

  

如果给定的非静态数据成员同时具有 brace-or-equal-initializer mem-initializer ,则 mem指定的初始化执行-initializer ,忽略非静态数据成员的大括号或等于初始化程序

这证明在主构造函数中为成员分配垃圾:

DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a), // this is mem-initializer for m_a, so m_a = 42 is ignored and you are getting garbage
    m_b(b) // the same for m_b
{
};

为避免重复使用默认值,您可以使用常量,因此您可以使用以下内容:

DelegatingCTorPlusInClass() : DelegatingCTorPlusInClass(m_a_default, m_b_default)
{
};

答案 1 :(得分:0)

您希望使用较少的参数从构造函数构建默认值,而不是依赖于内联初始化。

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass()
    :
    DelegatingCTorPlusInClass(42, "42") // default values
  {
  };

  DelegatingCTorPlusInClass(int a)
    :
    DelegatingCTorPlusInClass(a, "42") 
  {
  };

  DelegatingCTorPlusInClass(const std::string &b)
    :
    DelegatingCTorPlusInClass(42, b) 
  {
  };

  DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a),
    m_b(b)
  {
    // DO THINGS
  };

private:
  int m_a;
  std::string m_b;
};

构造函数应该定义该用法的值要求。只有当所有构造函数都为真时,内联初始化才有意义。

答案 2 :(得分:0)

您不需要使用非静态数据成员初始化程序和委派构造函数,因为它们存在。出了什么问题:

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass(int a = 42, std::string b = "42")
  : m_a(a), m_b(std::move(b))
  {
    // DO THINGS
  }

private:
  int m_a;
  std::string m_b;
};