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

C++ C++;模板复制构造函数深度复制,c++,arrays,templates,containers,C++,Arrays,Templates,Containers,为了方便起见,我正在编写一个通用数组类和重载运算符。我已使我的数组对象容纳其他数组对象,但重写*运算符时遇到问题。我需要复制左边的对象,所以我的操作符*代码如下: Array<T>& operator*(const double scalar) { return Array<T>(*this) *= scalar; } 编辑:我意识到我遇到了问题,因为我忽略了数组数组中内部数组的大小。现在情况更可靠了。每个人都帮了大忙,我想我正在努力让这一切顺利进行。我

为了方便起见,我正在编写一个通用数组类和重载运算符。我已使我的数组对象容纳其他数组对象,但重写*运算符时遇到问题。我需要复制左边的对象,所以我的操作符*代码如下:

Array<T>& operator*(const double scalar) {
    return Array<T>(*this) *= scalar;
}
编辑:我意识到我遇到了问题,因为我忽略了数组数组中内部数组的
大小。现在情况更可靠了。每个人都帮了大忙,我想我正在努力让这一切顺利进行。我的
操作符=
(我没有超载;很好,Michael)现在如下所示。它按预期运行,但我的程序中开始出现
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;
}

我按值取了一个数组。各种各样的问题。通过引用获取数组,一切都解决了。谢谢大家的帮助

您希望运算符*成员函数的外观如下所示:

Array<T> operator*(const double scalar) const {
    Array<T> result(*this);
    result *= scalar;
    return result;
}
数组运算符*(常数双标量)常数{
数组结果(*此项);
结果*=标量;
返回结果;
}

如果您返回一个
数组&
,那么您将返回一个对临时数组的引用,该引用将被销毁,从而导致未定义的行为。

您可能希望使该
运算符*
也成为常量。@MichaelAnderson:对--更改了将这三行合并为一行并没有什么不好的,就像OP的原始代码一样;事实上,我认为它更可读,因为您不引入声明临时变量名的噪声,而且它立即可见,基本上在执行“<代码> *此*=标量< /代码>带备份”。只是通过引用返回和缺少的
const
是错误的。@leftaroundabout:我认为很多人不会同意。使用
(lhs*=rhs)
作为等于
lhs
的右值是不可读的。@MichaelAnderson运算符*
的代码不应返回
。调用
Array(*this)
调用复制构造函数,我已经确认了这一点。另外,如果我使用
操作符*=
常量,我在使用
操作符*=
时不会出现编译错误,所以我一定不能对
这个
进行变异。你是对的,我会删除那些注释。你能给我们看看
数组::操作符=
?当您使用
data[i]=copyfrom.data[i]
时,您正在为数据调用
操作符=
。如果没有定义,您将得到默认值。因此,如果嵌套数组且数组没有=则会发生不好的事情。是否有原因不为
数据
成员使用
std::vector
std::Array
?然后,您可能会让默认的复制构造函数和赋值运算符做正确的事情。@MichaelAnderson我想您做到了;我嵌套数组,并在
数组
对象上调用
操作符=
。这可能是个问题。我将过载
操作符=
,然后再给您回复。
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;
}
template <typename T>
static Array<T> matrixSolve (Array<Array<T> > m);
Array<T> operator*(const double scalar) const {
    Array<T> result(*this);
    result *= scalar;
    return result;
}