C++模板复制构造函数深度复制
C++ Template Copy Constructor Deep Copy
为了方便起见,我正在编写一个泛型Array类和重载运算符。我得到了我的数组<>对象以容纳其他数组<>对象,但我在重写*运算符时遇到问题。我需要复制左边的对象,所以我的操作员*代码是这样的:
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);
}
我的想法是,如果数组不是泛型的,但总是用基元填充,那么这段代码就可以工作了。但我认为这里发生了一些事情,因为我使用的模板导致了我意想不到的行为。新的"深度复制"数组中的数据数组的行为就像它只是"复制自"数据数组的浅指针副本。
我是如何使用模板使这个复制构造函数同时适用于基元和对象的?或者,更好的是,有没有一种方法可以重载运算符*而不必担心复制构造函数?谢谢
编辑:这是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);
我是按值取一个数组。各种各样的问题。通过引用数组,一切都解决了。谢谢大家的帮助!
您希望您的operator*成员函数看起来像这样:
Array<T> operator*(const double scalar) const {
Array<T> result(*this);
result *= scalar;
return result;
}
如果您返回Array<T> &
,那么您将返回对临时的引用,该引用将被销毁,从而导致未定义的行为。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用