Здесь есть ряд проблем, которые я постараюсь устранить, одну за другой.
Что касается вашего основного вопроса, поскольку оператор присваивания копии определен внутри области действия MyClass
, вам также необходимо записать его определение как область видимости внутри MyClass
, просто добавив MyClass::
перед именем функции, как вы бы с любой другой областью.Далее, вам действительно нужно скопировать данные rhs
в this
, и вы должны вернуть ссылку на *this
.
MyClass& MyClass::operator=(const MyClass& rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
Если вы скопируете rhs
во временный файл и вернете это, вся семантика назначения копирования полностью нарушена.Это приведет к следующим вещам:
MyClass obj1 {999.0, 2468.0};
MyClass obj2 {0.0, 0.0};
obj2 = obj1; // should copy obj1 to obj2
cout << obj2.x << " " << obj2.y << '\n'; // outputs "0.0 0.0" ??!?!?
Также имейте в виду, что это тривиальный конструктор копирования, вы можете полностью удалить его, так как компилятор неявно сгенерирует для вас тот же самый, который выполняет член-член.мудрая копия, которая в этом случае полностью безопасна.См. специальные функции-члены .
В вашем operator+
теле функции есть следующие строки:
MyClass myVar;
MyClass.x = lhs.x + rhs.x;
MyClass.y = lhs.y + rhs.y;
return myVar;
Вы, вероятно, имеете в виду myVar.x
и myVar.y
.MyClass
относится только к типу, а попытка доступа MyClass.x
- бессмысленное утверждение.
Как правило, вы никогда не должны возвращать ссылку на временный объект, как в вашей текущей реализации.Локальные объекты уничтожаются при возврате функции, и это оставляет вам висячую ссылку на уничтоженный объект, память которого, скорее всего, будет перезаписана полным мусором в ближайшем будущем. Здесь - хорошее объяснение того, что происходит.
Дайте мне знать, если у вас возникнут какие-либо проблемы или что-то неясно после прочтения ссылок.Удачного кодирования!