Передача класса по ссылке не меняет оригинал - PullRequest
0 голосов
/ 22 января 2020

У меня есть класс, который обрабатывает спрайты рендеринга, который имеет объекты Ball и Gun, устанавливает их спрайты и отображает их каждый кадр. Я хочу передать этот шариковый объект оружию, чтобы оно могло выстрелить, когда пользователь нажимает пробел (ввод обрабатывается оружием). Я пробовал указатели, и теперь передаю по ссылке, но когда я изменяю их после передачи, это не влияет на оригинал. В моем основном классе я называю gun.init (& ball), который я покажу здесь. Gun имеет переменную Ball mBall.

class Gun : public GameObj
{
public:
    Gun()
        :GameObj(), mWaitSecs(0)
    {}
    void Update();      
  void Init(Ball &ball);      //init function that passes in ball?
private:
    float mWaitSecs;    //delay after firing beforeo you can move/fire
    Ball mBall;
};

void Gun::Init(Ball &ball) {  
  mBall = ball;
}

1 Ответ

4 голосов
/ 22 января 2020

[..], но когда я изменяю его после его передачи, он не влияет на оригинал.

Честно говоря, у вас есть базовое c недоразумение. И чтобы прояснить это, я должен сделать небольшой обход.

Передать по значению

void foo_value(int x) { x += 42; }

, вызывая эту функцию через

int y = 50;
foo_value(y);

не изменит значение y.

Передача по ссылке

void foo_ref(int& x) { x += 42; }

вызов этой функции изменит y:

int y = 50;
foo_ref(y); 
assert(y == 50+42);

Перепривязка ссылок

Вы не можете перепривязать ссылки. Вот почему вы не можете не инициализировать ссылку:

int& y;      // error
int x;
int& y = x;  // ok

Если у вас есть ссылка, вы не можете заставить ее ссылаться на что-то другое. Вы не можете «переназначить» ссылку:

int x = 0;
int& ref = x;
int y = 42;
ref = y;          // same as x = y; 

после последней строки, ref все еще является ссылкой на x.

Ваш код

Вы передаете ball по ссылке, но ваш участник mBall не является ссылкой. mBall является копией мяча, на который ссылается ball. Пример, аналогичный вашему коду:

void foo_copy_from_ref(int& x) {
    int mx = x;
    mx = 42;
}

Изменение копии не влияет на оригинал, независимо от того, сделали ли вы копию из ссылки.

У вас может быть ссылка на Ball как член, но вы должны инициализировать его в конструкторе, и вы не можете заставить его ссылаться на другой Ball позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...