`this` передано участнику [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 `this` передано участнику [закрыто]

Сообщение Anonymous »

Я наткнулся на код, который заставил меня задуматься, правильно ли все сделано, не попадая в неопределенное поведение и другие ловушки. Ниже приведен упрощенный вариант конструкции. Представьте себе игру, в которой игрок с заданными навыками стреляет из винтовки. Винтовка наносит врагу базовый урон, который увеличивается за счет навыков игрока. Кроме того, если навык игрока падает ниже некоторого минимального значения, отдача винтовки наносит урон игроку, уменьшая его очки здоровья.
В коде есть два класса: Player и Винтовка. Объект Player имеет очки здоровья, некоторый уровень навыков и винтовку. Объект «Винтовка» имеет базовый урон по врагам, а также базовый урон, нанесенный отдачей. Объект Rifle также содержит указатель на объект Player, которому он принадлежит. Код:

Код: Выделить всё

// example.cpp
#include 

struct Player;

struct Rifle {
Rifle(Player *p) : player{p} {}

int shoot();

int damage{8};
int recoil{1};
Player *player{};
};

struct Player {
Player(const int hp, const int s) : health_points{hp}, skill{s} {}

int shoot();

Rifle rifle{this};
int health_points{};
int skill{};
bool dead{false};
};

int Rifle::shoot() {
if (player->skill < 5) {
player->health_points -= recoil;
}

return player->skill * damage;
}

int Player::shoot() {
int damage{rifle.shoot()};
if (health_points < 1) {
dead = true;
}
return damage;
}

int main() {
Player player{100, 3};
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79084706/this-passed-to-member[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»