我有一个类,我使用this
来初始化void*
指针。但问题是,当我通过值传递该类的实例时,指针不会更改为堆栈上的新地址。所以,我想覆盖复制构造函数,用新地址this
重新分配指针。但我需要变量来调用超类构造函数,我通常通过构造函数参数得到它,但我的复制构造函数中没有它们...
我希望我解释得很好......
所以问题是:我可以保留默认复制构造函数的过程,在那里我添加重新分配指针的部分吗?或者有更好的选择吗?
由于
这是一些代码:
class GetsCopiedByValue : public SuperClass
{
GetsCopiedByValue(Type1 *t1, Type2 *t2, float var1, /* A lot of other things I need */) :
SuperClass(t1, t2), var1(var1)
{
t1->set_GetsCopiedByValue_Address(this); // ***
}
}
其他地方:
{
GetsCopiedByValue instance (t1, t2, 4.64, /* All the other things */);
SomeType *t = new SomeType(instance); // <-- here, it gets copied by value,
} // but the original "instance" goes (here) out of scope and the address
// I assigned (***) is not longer valid, so I have to
// reassign the address to the new address, after copying it.
答案 0 :(得分:2)
不确定这是否有帮助,但可以实际调用复制构造函数中的超类复制构造函数:
GetsCopiedByValue(GetsCopiedByValue const& other) :
SuperClass(other), var1(other.var1)
{
t1->set_GetsCopiedByValue_Address(this);
}
但我认为即使你省略了这个基类构造函数调用,C ++也会为你插入它。
答案 1 :(得分:0)
当你第一次构造一个对象时,你必须存储参数(可能在超类中,因为那就是使用它们),然后在复制构造中再次使用它们,即从你复制的对象中读出它们。 / p>
修改强>
更好的是,做@Konrad Rudoplh suggests并为基类定义和使用复制构造函数。