У меня есть указатель на объект. Как мне вызвать функцию, которая ожидает ссылку? - PullRequest
0 голосов
/ 16 февраля 2009

У меня есть функция, которая принимает ссылку на объект:

void move(Ball& ball);

У меня есть другая функция, вызывающая move (), в которой есть указатель на ball:

void foo(Ball* ball){
 //call move()
}

Как foo() должен передать мяч move()?

Должно ли это быть как:

move(*ball);

или

move(ball);

или

move(&ball);

Ответы [ 4 ]

11 голосов
/ 16 февраля 2009

Первый, ход (* шар).

второй, move (ball) пытается передать указатель, а третий, move (& ball) пытается передать указатель на указатель.

6 голосов
/ 16 февраля 2009

ход (* шар);

Вот почему. Вы можете думать о ссылке, как о взятии указателя на передаваемый объект. Таким образом, вы хотите сам объект, а не указатель. Если вы вызываете move (ball), вы будете брать ссылку (указатель) на указатель, а не на объект. Вместо этого move (* ball) разыменовывает указатель, а ссылка затем получает указатель этого разыменованного объекта.

4 голосов
/ 16 февраля 2009

С помощью оператора * на указателе вы разыменовываете его, получая объект Ball. Поскольку вы фактически передаете свой параметр в функцию, которая принимает Ball & (то есть ссылку Ball), будет передана только ссылка, а не весь объект. Правильное использование:

move(*ball);

Но я предлагаю вам назвать переменные таким образом, чтобы «говорить» об их природе, поэтому ballPtr или ball_ptr будет более уместным, и вы никогда не будете забудь о разыменовании.

1 голос
/ 30 декабря 2009

первый правильный, то есть ход (* шар) Шар - это указатель, указывающий на объект, вам нужно разыменовать его, после разыменования его объекта, на который указывает указатель шара.

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