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



我有一个运算符和函数,其目标是将向量指针的值复制到向量。我读过,只要它是一个向量指针,深度复制方法只会复制它的指针,而不会复制它的值。我想知道如何复制它的值(向量是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(),但它给了我相同的结果。

任何帮助都将不胜感激!

为"零规则">

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

基本上-不要。你应该努力遵循零规则:除非另有必要,否则设置好默认构造函数、赋值运算符和析构函数,让它们做它们应该做的事情。

在您的情况下:假设让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<BYTE>;或者,如果你不想在构建后改变大小,可以使用dyarray(现在不在标准库中;这里有一个替代方案(;等等。当您复制OBJECT_ITEM时,您选择的容器实际上会被正确复制。最后,不要持有指向OBJECT_ITEM的指针——只持有实际的OBJECT_ITEM的指针(看起来你已经在做了?(

在那里,现在你不能再有悬挂指针了——没有自定义构造函数、赋值运算符或其他类似的东西。

相关内容

最新更新