为了方便起见,我正在编写一个通用数组类和重载运算符。我已经让我的 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(©from.data[0], ©from.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/