委托复制构造函数和const数据初始化

时间:2017-08-01 08:38:17

标签: c++ constructor const copy-constructor delegating-constructor

我有一个类 func swordAction(){ addChild(sword) sword.removeFromParent() } func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { leftButton.name = "leftButton" rightButton.name = "rightButton" upButton.name = "upButton" downButton.name = "downButton" swordButton.name = "swordButton" let location = touch.location(in: self) let node : SKNode = self.atPoint(location) if node.name! == "swordButton" { swordAction() ,其中包含许多数据成员,其中一些是常量。所有数据成员都有适当的拷贝构造函数,所以我想默认我的类的拷贝构造函数:

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进行初始化,而不是复制。我想通过委托给复制构造函数来避免手动初始化所​​有数据成员,但是在这种情况下如何覆盖我的const数据成员? 例如:

a_

显然,所有这些方法都是邪恶的,因为他们试图初始化// 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 ... } 两次。

另一个解决方案是将所有常量数据移动到基类并编写所有需要的ctors,但它看起来很冗长。

是否有更简洁的方法来实施a

2 个答案:

答案 0 :(得分:2)

不幸的是,C ++ const字段初始化是一个特殊语法的特殊情况,构造函数委托也是如此,构造函数语法没有提供混合它们,所以这里没有干净利落的解决方案(至少对于当前的C ++而言)版本,也许以后......)。我能想到的最好的是:

iPhone

如果你只有复制ctor和一个附加的复制ctor没有意义,但如果你有很多额外的ctors,它可以减轻代码的维护。遗憾的是,只有非const字段设置可以使用私有方法在不同的ctors之间进行分解,但C ++标准就是这样。

答案 1 :(得分:0)

具有完整初始化列表的复制构造函数怎么样?由于您的数据是常量,因此您只能使用初始化列表为其分配值。

{{1}}