我有一个类 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
?
答案 0 :(得分:2)
不幸的是,C ++ const字段初始化是一个特殊语法的特殊情况,构造函数委托也是如此,构造函数语法没有提供混合它们,所以这里没有干净利落的解决方案(至少对于当前的C ++而言)版本,也许以后......)。我能想到的最好的是:
iPhone
如果你只有复制ctor和一个附加的复制ctor没有意义,但如果你有很多额外的ctors,它可以减轻代码的维护。遗憾的是,只有非const字段设置可以使用私有方法在不同的ctors之间进行分解,但C ++标准就是这样。
答案 1 :(得分:0)
具有完整初始化列表的复制构造函数怎么样?由于您的数据是常量,因此您只能使用初始化列表为其分配值。
{{1}}