C ++:关于复制构造函数的问题

时间:2010-08-07 15:24:58

标签: c++ memory-management copy-constructor

我有一个类,我使用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.

2 个答案:

答案 0 :(得分:2)

不确定这是否有帮助,但可以实际调用复制构造函数中的超类复制构造函数:

GetsCopiedByValue(GetsCopiedByValue const& other) :
     SuperClass(other), var1(other.var1)
{
     t1->set_GetsCopiedByValue_Address(this);
}

但我认为即使你省略了这个基类构造函数调用,C ++也会为你插入它。

答案 1 :(得分:0)

当你第一次构造一个对象时,你必须存储参数(可能在超类中,因为那就是使用它们),然后在复制构造中再次使用它们,即从你复制的对象中读出它们。 / p>

修改

更好的是,做@Konrad Rudoplh suggests并为基类定义和使用复制构造函数。