【问题标题】:C++: Question about copy constructorsC++:关于复制构造函数的问题
【发布时间】:2010-08-07 15:24:58
【问题描述】:

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

【问题讨论】:

  • 你能发布一个代码示例吗?你的代码现在是什么样子的?
  • 请贴一些代码。如果你使用的是 void *,你很可能做错了。
  • “我有一个类,我用它来初始化一个 void* 指针。”如果您提供代码会很好。无论如何,你为什么还需要 void*?
  • “但问题是,当我通过值传递该类的实例时,指针不会更改为堆栈上的新地址”......我很确定我不明白什么你在这里说...
  • 好的,我会改写一下 - 请发布一些相关且真实的代码。

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


【解决方案1】:

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

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

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

【讨论】:

  • +1: 嗯,是的,当然这是另一种解决方案 :) 请注意,如果您省略调用,则会调用基类的默认构造函数,因此您必须明确说明.
  • 如果你省略对基构造函数的显式调用,它会插入对 default 基构造函数的隐式调用,不一定是你想要的。
【解决方案2】:

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

编辑

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-12-19
    • 2013-09-15
    相关资源
    最近更新 更多