В программе есть класс 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;
}
}
Все работает, но поле не обнуляется.
Ваш оператор вызывается при присваивании объектов, но не их адресов. Т.е. он бы вызывался, если бы было
currentAnimation = anim1;
где и currentAnimation
, и anim1
были объектами. Но у вас присваивание адреса переменной указателю, и в этом случае нет никакого вызова оператора присваивания, а простая запись 32 (ну, или 64 - в зависимости от разрядности) бит адреса в некоторое место в памяти...
Предупреждая вопрос - "а как..." - а никак. Руками обнуляйте. Не работают тут никакие операторы - ну судите сами, пусть вы правы и нужно вызывать оператор при присваивании указателей... что делать в таком случае:
Animation *a1, *a2, anim;
a2 = a1;
a1 = &anim;
a2 = a1;
Следует ли в третьем присваивании вызывать тот же оператор? А в первом, когда указатель указывает не пойми куда? А при a1=nullptr
?
Думаю, вы поняли, почему это (вызов оператора) при присваивании указателей не делается?
P.S. И, кстати, "все работает" - да ничего не работает. Просто после присваивания указателей у вас currentAnimation->pole
просто эквивалентно anim1->pole
потому, что они указывают на одно место, а не потому, что вы что-то там скопировали...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Требуется, чтобы классы hero и SpawnEnemies находились в пространстве имен класса Engine
ЗдравствуйтеИспользую связку python и jquery, требуется загрузка файла на сервер
https://jsfiddlenet/yfp09xt2/ - Набросал рейтинг с html символами