C++ 通过赋值运算符深拷贝动态数组
C++ Deep copy of dynamic array through assignment operator
我正在尝试将一个动态分配的数组复制到一个实例。我的代码似乎是在复制值,但它还需要调整数组的大小以匹配“&other”大小的数组。
关于代码的一些信息:手头有两个 类,一个是 "Movie",它有一个标题,film-time,和 director(所有指针)作为私有成员.还有另一个称为 "MovieCollection" 的数组,它在给定索引中存储 "Movie" 的每个实例。
//These are private member variables:`
int ArrySize = 50; //There is another section of code that points to this and resizes if needed, I believe it needed a size at runtime though.
//Array to store instance of "movie"
Movie *movieArry = new Movie[ArrySize];
//This is assignment operator
const MovieCollection& operator=(const MovieCollection& other)
{
delete []movieArray;
int otherSizeArry = other.ArrySize;
Movie* temp;
temp = new Movie[otherSizeArry];
for (int i = 0; i < otherSizeArry; i++)
temp[i] = other.movieArry[i];
return *this;
delete []temp;
}
我在创建实例时使用了我编写的另一个函数来调整数组的大小。例如,我要复制的实例有 10 个索引,但我尝试将值复制到的新实例仍然有 50 个的限制。据我了解,我必须删除它,因为数组无法调整大小,然后复制新尺寸超过(以及值)。
如有任何帮助,我们将不胜感激,在此先致谢。另外,抱歉,如果需要更多代码。我不想付出比需要更多的东西。
您的赋值运算符实现不正确。它在分配新的 temp
数组之前释放 movieArray
数组。如果分配失败,class 将处于不良状态。在调用 return *this;
之前,您没有将 temp
数组分配给 movieArray
(永远不会达到 delete []temp
,编译器应该警告过您)。
运算符应该看起来更像这样:
MovieCollection& operator=(const MovieCollection& other)
{
if (&other != this)
{
int otherSizeArry = other.ArrySize;
Movie* temp = new Movie[otherSizeArry];
for (int i = 0; i < otherSizeArry; ++i) {
temp[i] = other.movieArry[i];
}
// alternatively:
// std::copy(other.movieArry, other.movieArry + otherSizeArry, temp);
std::swap(movieArray, temp);
ArrySize = otherSizeArry;
delete[] temp;
}
return *this;
}
如果你的 class 有一个复制构造函数(它应该 - 如果没有,你需要添加一个),赋值运算符的实现可以大大简化:
/*
MovieCollection(const MovieCollection& other)
{
ArrySize = other.ArrySize;
movieArray = new Movie[ArrySize];
for (int i = 0; i < ArrySize; ++i) {
movieArray[i] = other.movieArry[i];
}
// alternatively:
// std::copy(other.movieArry, other.movieArry + ArrySize, movieArray);
}
*/
MovieCollection& operator=(const MovieCollection& other)
{
if (&other != this)
{
MovieCollection temp(other);
std::swap(movieArray, temp.movieArray);
std::swap(ArrySize, temp.ArrySize);
}
return *this;
}
我正在尝试将一个动态分配的数组复制到一个实例。我的代码似乎是在复制值,但它还需要调整数组的大小以匹配“&other”大小的数组。
关于代码的一些信息:手头有两个 类,一个是 "Movie",它有一个标题,film-time,和 director(所有指针)作为私有成员.还有另一个称为 "MovieCollection" 的数组,它在给定索引中存储 "Movie" 的每个实例。
//These are private member variables:`
int ArrySize = 50; //There is another section of code that points to this and resizes if needed, I believe it needed a size at runtime though.
//Array to store instance of "movie"
Movie *movieArry = new Movie[ArrySize];
//This is assignment operator
const MovieCollection& operator=(const MovieCollection& other)
{
delete []movieArray;
int otherSizeArry = other.ArrySize;
Movie* temp;
temp = new Movie[otherSizeArry];
for (int i = 0; i < otherSizeArry; i++)
temp[i] = other.movieArry[i];
return *this;
delete []temp;
}
我在创建实例时使用了我编写的另一个函数来调整数组的大小。例如,我要复制的实例有 10 个索引,但我尝试将值复制到的新实例仍然有 50 个的限制。据我了解,我必须删除它,因为数组无法调整大小,然后复制新尺寸超过(以及值)。
如有任何帮助,我们将不胜感激,在此先致谢。另外,抱歉,如果需要更多代码。我不想付出比需要更多的东西。
您的赋值运算符实现不正确。它在分配新的 temp
数组之前释放 movieArray
数组。如果分配失败,class 将处于不良状态。在调用 return *this;
之前,您没有将 temp
数组分配给 movieArray
(永远不会达到 delete []temp
,编译器应该警告过您)。
运算符应该看起来更像这样:
MovieCollection& operator=(const MovieCollection& other)
{
if (&other != this)
{
int otherSizeArry = other.ArrySize;
Movie* temp = new Movie[otherSizeArry];
for (int i = 0; i < otherSizeArry; ++i) {
temp[i] = other.movieArry[i];
}
// alternatively:
// std::copy(other.movieArry, other.movieArry + otherSizeArry, temp);
std::swap(movieArray, temp);
ArrySize = otherSizeArry;
delete[] temp;
}
return *this;
}
如果你的 class 有一个复制构造函数(它应该 - 如果没有,你需要添加一个),赋值运算符的实现可以大大简化:
/*
MovieCollection(const MovieCollection& other)
{
ArrySize = other.ArrySize;
movieArray = new Movie[ArrySize];
for (int i = 0; i < ArrySize; ++i) {
movieArray[i] = other.movieArry[i];
}
// alternatively:
// std::copy(other.movieArry, other.movieArry + ArrySize, movieArray);
}
*/
MovieCollection& operator=(const MovieCollection& other)
{
if (&other != this)
{
MovieCollection temp(other);
std::swap(movieArray, temp.movieArray);
std::swap(ArrySize, temp.ArrySize);
}
return *this;
}