我想做以下事情:
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";
};
但是,从一个构造函数传递到另一个构造函数的成员尚未初始化,因此基本上是“随机的”。我怎么能实现类似的东西?
答案 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;
};