Перегрузка оператора присваивания

389
20 сентября 2017, 12:28

В программе есть класс Player, Animation.

class Player
{
 ...
 Animation* currentAnimation;
 Animation anim1;
 Animation anim2;
 void Update(bool state);
 ...
 //при создании экземпляра класса currentAnimation инициализируется
}
void Player::Update(bool state)
{
   if(state) currentAnimation = &anim1;
   if(!state) currentAnimation = &anim2;
}

Мне нужно при присваивании обнулять одно из полей. То есть при таком присваивании: currentAnimation = &anim1; у anim1 должно обнуляться, допустим, поле pole1.
Я перегружал оператор присваивания в классе Animation таким образом:

Animation & Animation::operator=(Animation & anim)
{
    if (this != &anim)
    {
        //тут присваиваются остальные поля
        //по типу this->pole2 = anim.pole2;
        ...
        anim.pole1 = 0;
        return *this;
    }
}

Все работает, но поле не обнуляется.

Answer 1

Ваш оператор вызывается при присваивании объектов, но не их адресов. Т.е. он бы вызывался, если бы было

currentAnimation = anim1;

где и currentAnimation, и anim1 были объектами. Но у вас присваивание адреса переменной указателю, и в этом случае нет никакого вызова оператора присваивания, а простая запись 32 (ну, или 64 - в зависимости от разрядности) бит адреса в некоторое место в памяти...

Предупреждая вопрос - "а как..." - а никак. Руками обнуляйте. Не работают тут никакие операторы - ну судите сами, пусть вы правы и нужно вызывать оператор при присваивании указателей... что делать в таком случае:

Animation *a1, *a2, anim;
a2 = a1;
a1 = &anim;
a2 = a1;

Следует ли в третьем присваивании вызывать тот же оператор? А в первом, когда указатель указывает не пойми куда? А при a1=nullptr?

Думаю, вы поняли, почему это (вызов оператора) при присваивании указателей не делается?

P.S. И, кстати, "все работает" - да ничего не работает. Просто после присваивания указателей у вас currentAnimation->pole просто эквивалентно anim1->pole потому, что они указывают на одно место, а не потому, что вы что-то там скопировали...

READ ALSO
C++ Как наиболее правильно определить класс в неймспейсе другого класса?

C++ Как наиболее правильно определить класс в неймспейсе другого класса?

Требуется, чтобы классы hero и SpawnEnemies находились в пространстве имен класса Engine

195
Загрузка файла на сервер (python, jquery)

Загрузка файла на сервер (python, jquery)

ЗдравствуйтеИспользую связку python и jquery, требуется загрузка файла на сервер

197
Как добавить html код по клику vue.js

Как добавить html код по клику vue.js

Мне нужно, чтобы по клику на кнопку

213
Звездный рейтинг с шрифтом “Fontello”

Звездный рейтинг с шрифтом “Fontello”

https://jsfiddlenet/yfp09xt2/ - Набросал рейтинг с html символами

279