Проблема c оператором присваивания
На днях решил попрактиковаться работать с классами ,в которых используется динамическая память.Для этого реализовал небольшой класса для работы с векторами. У меня возникла проблема: при попытке присвоить экземпляру класса другой экземпляр с которым проводились мат операции выдается следующая ошибка:
E0349 отсутствует оператор "=", соответствующий этим операндам
Я пробовал перегрузить оператор "=",так чтобы в параметра передавалась копия объекта(знаю,так делать не рекомендуется),но тогда ,при попытке копирования объекта, в аргументы метода компилятор выдает: Не имеется подходящего конструктора копии.
Также при попытке передавать в аргументы методов объект по ссылке на константу ,возникает ошибка(E1086 Объект содержит квалификаторы типа, несовместимые с элементом функции) в строчках кода где ведется работа с этим объектом.
Я первый раз обращаюсь за помощью на подобные ресурсы,т.к обычно на решение какой-либо проблемы у меня не уходит больше дня,но здесь мне ничего не приходит в голову.С++ начал изучать недавно,поэтому если найдете какие-то недочеты в код ,то пожалуйста пишите о них.
Сам код:
#include<iostream>
using namespace std;
class Vector2D
{
private:
double* x = nullptr;
double* y = nullptr;
public:
Vector2D(double x, double y)
{
this->x = new double{ x };
this->y = new double{ y };
}
Vector2D(const Vector2D& other)
{
if (this->x == nullptr || this->y == nullptr)
{
this->x = new double;
this->y = new double;
}
//Объект содержит квалификаторы типа, несовместимые с элементом функции
*this->x = other.get_x();
*this->y = other.get_y();
}
double get_x()
{
return *x;
}
double get_y()
{
return *y;
}
Vector2D& operator =(const Vector2D& other)
{
//Объекы содержит квалификаторы типа,несовместимые с элементом функции*
*this->x = other.get_x();
*this->y = other.get_y();
return *this;
}
template<typename T, class = enable_if_t< (is_same<T, int>::value) || (is_same<T, double>::value) >> Vector2D operator *(T factor)
{
Vector2D result(this->get_x() * factor, this->get_y() * factor);
return result;
}
~Vector2D()
{
delete x;
delete y;
}
friend void print(Vector2D& obj);
};
void print(Vector2D& obj)
{
cout << "{" << *obj.x << ";" << *obj.y << "}" << endl;
}
int main(int argc, char* argv)
{
Vector2D a(5, 1);
Vector2D b(7, 1);
b = a * 5; // отсутствует оператор "=", соответствующий этим операндам
print(b);
return 0;
}
Ответы (1 шт):
Следующий код компилируется (добавил const функциям-членам и включил заголовочные файлы):
#include <type_traits>
#include <iostream>
using namespace std;
class Vector2D
{
private:
double* x = nullptr;
double* y = nullptr;
public:
Vector2D(double x, double y)
{
this->x = new double{ x };
this->y = new double{ y };
}
Vector2D(const Vector2D& other)
{
if (this->x == nullptr || this->y == nullptr)
{
this->x = new double;
this->y = new double;
}
//Объект содержит квалификаторы типа, несовместимые с элементом функции
*this->x = other.get_x();
*this->y = other.get_y();
}
double get_x() const
{
return *x;
}
double get_y() const
{
return *y;
}
Vector2D& operator =(const Vector2D& other)
{
//Объекы содержит квалификаторы типа,несовместимые с элементом функции*
*this->x = other.get_x();
*this->y = other.get_y();
return *this;
}
template<typename T, class = enable_if_t< (is_same<T, int>::value) || (is_same<T, double>::value) >> Vector2D operator *(T factor)
{
Vector2D result(this->get_x() * factor, this->get_y() * factor);
return result;
}
~Vector2D()
{
delete x;
delete y;
}
friend void print(Vector2D& obj);
};
void print(Vector2D& obj)
{
cout << "{" << *obj.x << ";" << *obj.y << "}" << endl;
}
int main(int argc, char* argv)
{
Vector2D a(5, 1);
Vector2D b(7, 1);
b = a * 5; // отсутствует оператор "=", соответствующий этим операндам
print(b);
return 0;
}