Я написал класс Vector и перегрузил для него операторы = и +. Код ниже почему-то приводит к аварийному завершению, хотя и выводит правильный результат. Подскажите, пожалуйста, где ошибка в коде?
class Vector {
private:
unsigned char* vec;
int len;
public:
Vector();
Vector(const Vector&);
Vector(int n);
Vector(int n, unsigned char m);
void print();
Vector& operator = (const Vector&);
~Vector();
friend Vector operator + (const Vector&, const Vector&);
};
Vector::Vector() : len(0)
{
}
Vector::Vector(const Vector& obj) : len(obj.len)
{
vec=new unsigned char[len];
for(int i=0;i<len;i++)
vec[i]=obj.vec[i];
}
Vector::Vector(int n) : len(n)
{
vec=new unsigned char[n];
for(int i=0;i<n;i++)
vec[i]=0;
}
Vector::Vector(int n, unsigned char m) : len(n)
{
vec=new unsigned char[n];
for(int i=0;i<n;i++)
vec[i]=m;
}
void Vector::print()
{
for(int i=0;i<len;i++)
cout << (int)vec[i] << ' ';
}
Vector& Vector::operator = (const Vector& v)
{
len=v.len;
for(int i=0;i<len;i++)
vec[i]=v.vec[i];
return (*this);
}
Vector::~Vector()
{
delete[] vec;
}
Vector operator + (const Vector& v1, const Vector& v2)
{
if (v1.len>=v2.len)
{
Vector res(v1.len);
for(int i=0;i<v2.len;i++)
res.vec[i]=v1.vec[i]+v2.vec[i];
for(int i=v2.len;i<v1.len;i++)
res.vec[i]=v1.vec[i];
return res;
}
else
{
Vector res(v2.len);
for(int i=0;i<v1.len;i++)
res.vec[i]=v1.vec[i]+v2.vec[i];
for(int i=v1.len;i<v2.len;i++)
res.vec[i]=v2.vec[i];
return res;
}
}
int main()
{
int n, el;
cout << "Enter size of first vector: ";
cin >> n;
cout << "Enter value of elements of first vector: ";
cin >> el;
Vector a(n, el);
cout << "Enter size of second vector: ";
cin >> n;
cout << "Enter value of elements of second vector: ";
cin >> el;
Vector b(n, el);
Vector res;
res=a+b;
res.print();
return 0;
}
У вас неправильный оператор присваивания.
Vector res;
Вызван конструктор по умолчанию, создал нулевой длины вектор. Кстати, я бы на вашем месте нулил не только длину, но и указатель пустого вектора...
res=a+b;
Возвращается некоторый вектор, который присваивается. Но куда?
Vector& Vector::operator = (const Vector& v)
{
len=v.len;
Вы говорите, что длина вашего вектора теперь - v.len
. Но память вы не выделили...
for(int i=0;i<len;i++)
vec[i]=v.vec[i];
return (*this);
}
И тем не менее в нее пишете. Куда именно? тем более что ваш конструктор по умолчанию вообще поле vec
не инициализировал - так что пишете вы "на деревню дедушке Константину Макарычу", вполне при этом портя, например, какие-нибудь служебные структуры менеджера памяти или какие-то данные. А может, и не портя. UB - оно такое undefined...
Виртуальный выделенный сервер (VDS) становится отличным выбором
Возникла трудность при решении такой задачи: дан массив строк, в котором записаны имена и фамилии пользователейНужно вывести пользователей...
Программа находит в строке char последовательности одинаковых символов длинной более 3 символов(кроме пробела) и закидывает эти фрагменты...
Я использую примерТут выводятся положения точки на экране :