【发布时间】:2018-01-08 00:42:32
【问题描述】:
我有一个类A 有很多数据成员,其中一些是不变的。所有数据成员都有适当的复制构造函数,所以我想默认我的类的复制构造函数:
class A
{
public:
A() : a(1) {}
A(const A& op) = default;
private:
// ... Lots of constant and non-constant member data ...
const int a;
};
然后,我想编写一个构造函数,它接受对A 的引用和一个应该初始化常量数据成员之一的值:
A(const A& op, const int a_);
这里应该复制op,之后应该用a_ 初始化a,或者不要复制。我想通过委托给复制构造函数来避免手动初始化所有数据成员,但是在这种情况下如何覆盖我的 const 数据成员?
例如:
// Illegal: constructor delegation can't be mixed with field initialization.
A(const A& op, const int a_) : A(op), a(a_) {}
// Illegal: attempt to assign constant member.
A(const A& op, const int a_) : A(op) { a = a_; }
// Hack. May lead to UB in some cases.
A(const A& op, const int a_) : A(op)
{
*(const_cast<int*>(&a)) = a_;
// ... or same tricks with memcpy ...
}
显然,所有这些方法都是邪恶的,因为它们尝试初始化 a 两次。
另一种解决方案是将所有常量数据移至基类并编写所有需要的 ctor,但它看起来很冗长。
有没有更简洁的方法来实现A(const A&, int a_)?
【问题讨论】:
-
a_的值是否不受约束? -
@StoryTeller 你所说的不受约束是什么意思?
a和a_不一定是整数,这只是一个例子。通常,构造函数接受对值的 const 引用。 -
+1 有问题,因为我已经有很多次了,只是将所有内容都转储到带有构造函数的嵌套结构中。然后,由于访问本来是我自己的成员的东西现在有点难看,我将 getter 和 setter 放在主类上,并向自己和其他人假装我太OO了,我什至不会访问我的成员变量getter 和 setter,并且真的一直打算把它们放在那里。很想听听这里的朋友们想出什么。
-
为什么
int a_不是int const a_? -
@MariusBancila 好的,顺其自然。解决了我的问题。
标签: c++ constructor constants copy-constructor delegating-constructor