通过赋值运算符的C ++动态数组的深层复制

布赖恩

我正在尝试将动态分配的数组复制到实例。我的代码似乎正在复制值,但是还需要调整数组的大小以匹配“&other”大小的数组。

有关代码的一些信息:手头有两个类,一个是“电影”,它以标题,电影时间和导演(所有指针)作为私有成员。还有另一个称为“ 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个限制。据我了解,由于无法调整数组大小,因此必须删除它,然后复制新尺寸(以及值)。

任何帮助将不胜感激,并在此先感谢您。另外,如果需要更多代码,对不起。我不想付出超出所需的一切。

雷米·勒博

您的赋值运算符实施不正确。movieArray在分配新temp数组之前释放数组。如果分配失败,则该类将处于错误状态。而且您没有在调用之前temp数组分配给它(这是永远不会达到的,编译器应该已经对此发出警告)。movieArrayreturn *this;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;
}

如果您的类有一个复制构造函数(如果没有,则需要添加一个),可以大大简化赋值运算符的实现:

/*
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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有赋值运算符的类的C ++深层复制

C ++复制赋值运算符类

复制构造函数,赋值运算符C ++

C ++复制/移动构造函数和赋值运算符

C ++:“ T a = b”-复制构造函数或赋值运算符?

引用对象变量的c ++复制赋值运算符

重载C ++中字符数组的赋值运算符

C ++。类中指针数组的赋值运算符

使用复制运算符作为赋值运算符

复制赋值运算符返回* this vs(* this)

C ++-没有复制构造函数或赋值运算符的数组操作

C ++中的赋值运算符模板和复制构造函数

如何避免共享指针的复制赋值运算符 c++

C++中的复制构造函数和赋值运算符

删除默认C ++复制和移动构造函数和赋值运算符的缺点?

复制构造函数和复制赋值运算符?

具有函数运算符的C ++数组类,用于赋值

使用STL向量复制构造函数与赋值运算符

派生类的复制赋值运算符

具有多重继承的复制赋值运算符

复制构造函数和默认赋值运算符

隐式删除复制赋值运算符,因为字段具有已删除的复制赋值运算符

Python:在 Numpy 数组赋值中使用相等运算符

C ++向量复制构造函数和赋值运算符是否还会复制保留空间?

是否为数组/向量插入调用了赋值运算符或复制构造函数?

依赖项没有复制构造函数或赋值运算符时的 C++ 初始化器列表

在C ++中,具有const数据成员的类可以没有复制赋值运算符吗?

在 C++ 中使用带有字符串的复制构造函数和/或赋值运算符时堆栈溢出

如何为包含 shared_ptr 的类创建复制构造函数/赋值运算符?C++