【发布时间】:2017-02-26 12:26:01
【问题描述】:
我有一个带有数组和大小字段的 Vector 类。当两个数组 v1 和 v2 中的每一个都具有多个元素时,在复制运算符中为该数组分配内存时会出现问题。我该如何解决?这是一个代码:
#include<iostream>
using namespace std;
class Vector
{
private:
unsigned size;
double *arr;
public:
Vector();
Vector(double *arr, unsigned size);
Vector(const Vector ©);
Vector &operator= (const Vector &vector);
friend Vector operator+ (const Vector &varLeft, const Vector &varRight);
friend ostream & operator<< (ostream &output, const Vector &var);
friend istream & operator>> (istream &input, Vector &var);
};
int unitTest();
int main()
{
unitTest();
system("pause");
return 0;
}
int unitTest()
{
Vector v1;
cin >> v1;
Vector v2;
cin >> v2;
Vector v3;
cout << "Your Vector v1:" << endl;
cout << v1 << endl;
cout << "Your Vector v2:" << endl;
cout << v2 << endl;
cout << "Arrays +:" << endl;
v3 = v1 + v2;
cout << v3 << endl;
return 0;
}
Vector::Vector()
{
arr = new double[size];
};
Vector::Vector(double *arr, unsigned size) : size(size)
{
arr = new double[size];
for (int i = 0; i < size; ++i)
{
this->arr[i] = arr[i];
}
};
当 operator+ 返回值时,我的程序在 'arr = new double[size];' 行之后崩溃复制操作符。
Vector::Vector(const Vector ©)
{
size = copy.size;
arr = new double[size];
for (int i = 0; i < size; ++i)
{
arr[i] = copy.arr[i];
}
}
Vector operator+ (const Vector &varLeft, const Vector &varRight)
{
Vector res;
res.size = varLeft.size;
if (varLeft.size == varRight.size)
{
for (int i = 0; i < res.size; ++i)
{
res.arr[i] = varLeft.arr[i] + varRight.arr[i];
}
}
else
{
cout << "Error. Vectors have different size." << endl;
}
return res;
}
ostream & operator<< (ostream &output, const Vector &var)
{
for (int i = 0; i < var.size; ++i)
{
output << ' ';
output << var.arr[i];
}
output << endl;
return output;
}
istream & operator>> (istream &input, Vector &var)
{
cout << "Enter size of array --> ";
input >> var.size;
var.arr = new double[var.size];
for (int i = 0; i < var.size; ++i)
{
cout << "Enter " << i + 1 << " element --> ";
input >> var.arr[i];
}
return input;
}
Vector & Vector::operator= (const Vector &vector)
{
if (this != &vector)
{
if (arr != 0)
{
delete[]arr;
}
size = vector.size;
arr = new double[size];
for (int i = 0; i < size; ++i)
{
arr[i] = vector.arr[i];
}
}
return *this;
}
【问题讨论】:
-
您是否为运算符 > 实现了友好的功能?由于您使用的是对象的直接输入/输出。代码本身也有很多错误,否则会导致隐式错误。
-
是的。我实现了,但是忘记添加到我的问题中,请稍等,我会添加它
-
MCVE 请!例如,您正在调用
Vector::operator=,但我们看不到它是如何实现的。 -
能通过他们会很棒。此外,您没有要删除 arr 的 Vector 类的析构函数。你也没有初始化数组的大小,“size”..
-
您的整个班级可以而且应该替换为
std::vector<double>,这样不会崩溃或泄漏内存。