Переназначение указателя, когда объект, на который он указывает, удален экземпляром другого класса - PullRequest
0 голосов
/ 21 мая 2019

Я создаю игровой макет Tower Defense, в котором враги пытаются пересечь экран до того, как они будут уничтожены.

Указатели на динамически размещаемые объекты Enemy хранятся в векторе внутри класса EnemyManager, который контролирует их появление ипропадают.Когда здоровье врага достигает нуля, EnemyManager удаляет его, используя delete, а также erase s указатель.

У меня есть объект BulletTower, который предназначен для привязки к одному врагу и стрельбы доэто разрушено, затем зафиксируйте на другом.Для этого требуется указатель на объект Enemy, но если Enemy умирает и удаляется EnemyManager, указатель зависает.

Кажется, что указатель не может определить, заблокирован ли враг.на уничтожен.Я посмотрел на умные указатели, но кажется, что общие указатели не будут работать, учитывая, что враги удаляются вручную, когда их здоровье достигает нуля.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы можете сохранить указатель на фактический объект Enemy в переменной.И иметь указатель на эту переменную-указатель для BulletTower объектов.Когда Enemy убит, EnemyManager может изменить переменную на nullptr, а объект BulletTower может проверить этот факт, используя имеющийся у него указатель.

Таким образом, по сути, BulletTowerпривязывается к переменной-указателю, а не к объекту Enemy напрямую.

ИЛИ

Поддерживает счетчик количества объектов BulletTower, заблокированных наEnemy.Не удаляйте Enemy, если этот счетчик не стал 0. Для BulletTower снимите блокировку, когда энергия стала 0 и уменьшите счетчик блокировки.

0 голосов
/ 21 мая 2019

Слабый указатель может выполнять эту работу.

Кроме того, вместо указания вражеского указателя на BulletTower, вы можете дать функцию или объект, который будет возвращать текущего заблокированного врага, если он живили верните новый.

...