【问题标题】:How to Deep Copy Values of Vector Pointer (Not just the pointer)?如何深度复制向量指针的值(不仅仅是指针)?
【发布时间】:2021-01-06 04:24:07
【问题描述】:

我有一个运算符和函数,其目标是将向量指针的值复制到向量。我读过只要它是一个向量指针,深度复制方法只会复制它的指针,而不是它的值。我想知道如何将其值复制过来。 (向量是CObject类的成员)

算子函数:

void CObject::operator=(CObject& rhs)
{
    this->ClearObject();   //Object will be cleared first
    // How to perform the deep copy below?
    copy(rhs.m_Vector.begin(), rhs.m_Vector.end(), back_inserter(this->m_Vector));
}

声明为 -> void operator=(CObject& rhs);

算子函数的示例应用(在另一个类中执行)

CObject* m_pObjectOne;
CObject  m_ObjectTwo;

m_ObjectTwo = m_pObjectOne;

(因此,当m_pObjectOne在其类析构函数中被删除时,m_ObjectTwo就失去了它的值)

矢量和其他:

struct OBJECT_ITEM
{
    char  m_chType;
    UINT  m_nDataByte;
    BYTE* m_pData;
    CString m_strRecipeTag;
}

std::vector<OBJECT_ITEM> m_Vector;

我也尝试过其他深拷贝方法,例如 push_back()assign(),但结果相同。

任何帮助将不胜感激!

【问题讨论】:

  • m_ObjectTwo = m_pObjectOne真的可以编译吗?您提供的operator= 函数不接受CObject * rhs。
  • @Sprite 是的,它是可编译的。嗯,我想知道是不是因为我已经简化了它。 m_pObjectOne 和 m_ObjectTwo 在我这边有数组。但它仍然是相似的。声明也是在 header 中完成的。
  • @Han 您要复制的向量到底包含什么?请提供更多详细信息。
  • @RemyLebeau 我已将矢量内容编辑到问题中,请看一下。
  • @Han 这并没有改变我所说的。您的代码当前正在浅复制m_pData,如果每个OBJECT_ITEM 都应该分配自己的数据,这将不起作用。 OBJECT_ITEM 应该有一个析构函数、一个复制构造函数和一个复制赋值运算符(在 C++11 及更高版本中,还有一个移动构造函数和一个移动赋值运算符),以便每个 OBJECT_ITEM 完全管理自己的数据。

标签: c++ pointers vector copy


【解决方案1】:

争取“零规则”。

如何深度复制向量指针(不仅仅是指针)的值?

基本上 - 不要。您应该努力遵循rule of zero:除非另有必要,否则请进行设置,以便默认构造函数、赋值运算符和析构函数执行应有的操作。

在您的情况下:假设您让CObject 使用其默认(复制)赋值运算符。这意味着,rhs.m_Vector 将分配给lhs.m_Vector。而向量赋值是指将向量的各个成员分配给它们对应的成员。

你写你的向量的方式,不会做你想做的事:你写你想避免“当m_pObjectOne在其类析构函数中被删除时,m_ObjectTwo失去它的价值)”的情况。好吧,既然您愿意持有对象的副本,请考虑以下内容:

struct OBJECT_ITEM
{
    char  m_chType;
    UINT  m_nDataByte;
    MyContainer m_upData;
    CString m_strRecipeTag;
}

然后选择或写MyContainer 以满足您的需要。它可能只是一个std::vector&lt;BYTE&gt;;或者如果您不想在构建后更改大小,请使用dynarray(这些天不在标准库中;here's an alternative);等等。当您复制OBJECT_ITEM 时,您选择的容器实际上会被正确复制。最后,不要持有指向 OBJECT_ITEM's 的指针 - 只需持有实际的 OBJECT_ITEM's(您似乎已经在这样做了吗?)

而且,现在你不能再有悬空指针 - 没有自定义构造函数、赋值运算符或其他类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多