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

时间:2012-04-05 02:49:26

标签: c++ arrays templates containers

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

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

(operator * =已经过载并且正常工作)。

我覆盖了复制构造函数,如下所示:

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

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

我的想法是,如果数组不是通用的,但总是用原语填充,那么这段代码就可以了。但我认为这里有一些事情,因为我使用的模板导致我不期望的行为。新的“深度复制”数组中的数据数组就像它只是“copyfrom”数据数组的浅指针副本。

如何使用模板使这个复制构造函数对基元和对象都有效?或者,更好的是,有没有办法重载operator *而不用担心复制构造函数?感谢。

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

Array<T>& operator*=(const double scalar) {
    for (int i=0; i<size_; i++)
        data[i]*=scalar;
    return *this;
}
编辑:我意识到我遇到了问题,因为我忽略了数组数组中内部数组的size。事情现在更可靠了。每个人都非常有帮助,我想我正在努力做这项工作。我的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);

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

1 个答案:

答案 0 :(得分:3)

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

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

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

相关问题