gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:12 26 4
gpt4 key购买 nike

为了方便起见,我正在编写一个通用数组类和重载运算符。我已经得到我的 Array<> 对象来保存其他 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);

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

最佳答案

您希望您的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com