C++ 模板复制构造函数深复制

标签 c++ arrays templates containers

为了方便起见,我正在编写一个通用数组类和重载运算符。我已经让我的 Array<> 对象来保存其他 Array<> 对象,但我在覆盖 * 运算符时遇到了问题。我需要复制左边的对象,所以我的运算符(operator)*代码是这样的:

Array<T>& operator*(const double scalar) {
    return Array<T>(*this) *= scalar;
}

(运算符*=已重载并且可以工作)。

我重写了复制构造函数,如下所示:

更新:新的复制构造函数:

Array<T> (const Array<T>& copyfrom) {
    size_=copyfrom.size();
    data=new T[size_];
    copy(&copyfrom.data[0], &copyfrom.data[size_], data);
}

我的想法是,如果数组不是通用的,而是始终填充基元,则此代码可以工作。但我认为这里发生了一些事情,因为我使用的模板导致了我不期望的行为。新的“深层复制”数组中的数据数组就像“copyfrom”数据数组的浅指针拷贝一样。

如何使用模板使此复制构造函数同时适用于基元和对象?或者,更好的是,有没有一种方法可以重载运算符*而不用担心复制构造函数?谢谢。

编辑:这是operator*=的代码。然而,我仍然认为我的问题在于我对复制构造函数的使用。

Array<T>& operator*=(const double scalar) {
    for (int i=0; i<size_; i++)
        data[i]*=scalar;
    return *this;
}

编辑:我意识到我遇到了问题,因为我忽略了数组数组中内部数组的大小。现在事情更可靠了。每个人都非常有帮助,我想我正在努力完成这项工作。我的 operator= (我没有重载;很好,迈克尔)现在如下。它的行为符合预期,但我开始在程序中遇到 malloc 错误,我正在探索原因。这里的内存管理有问题吗?

Array<T>& operator=(const Array<T>& a) {
    if (this==&a)
        return *this;
    delete [] data;

    size_=a.size();
    data=new T(size_);
    copy(&a.data[0], &a.data[a.size()], data);

    return *this;
}

编辑:我修复了 malloc 错误!我的方法现在都按预期工作了。内存问题出现是因为我有这个方法头:

template <typename T>
static Array<T> matrixSolve (Array<Array<T> > m);

我正在按值获取数组的数组。各种各样的问题。通过引用获取数组,一切顺利。谢谢大家的帮助!

最佳答案

你会希望你的operator*成员函数看起来像这样:

Array<T> operator*(const double scalar) const {
    Array<T> result(*this);
    result *= scalar;
    return result;
}

如果您返回Array<T> & ,那么您将返回对临时对象的引用,该临时对象将被销毁,从而导致未定义的行为。

关于C++ 模板复制构造函数深复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022037/

相关文章:

用于实现二进制文件格式的 Python 模块?

c++ - 使用 Memory Sanitizer 检测 libc++

c++ - 构造函数中的 vector<unique_ptr<A>> - 错误 : call to implicitly-deleted copy constructor

c - 如何创建一个程序,要求用户输入 "up to"20 个整数,并使用传递给函数的参数来输出最大值、最小值和平均值?

java - 创建一个字符和对象数组?

c# - 在 WPF 中为整个应用程序设置皮肤的推荐方法是什么?

c++ - 运行时检查失败 #0 -(ESP 的值未正确保存)- 调用存储在结构中的函数时

c++ - `-1` 是否适合用作无符号整数的最大值?

android - 从 byte[] 中读取 EXIF 数据

c++ - 如何构建特定函数调用的图形?