Различие между ссылками и указателями [дубликат]

Для того, что говорит доктор: «OnTriggerStay вызывается один раз за обновление физики для каждого другого Коллайдера, который касается триггера». Это означает, что ваш код:

if (otherCollider.tag == "Desk")
{ 
    collidingWithDesk = true;
    transform.Translate(0, 0, 0);
    anim.Play("enemyHit");
    StartCoroutine(enemyIsAttacking());
}

будет вызываться при каждом обновлении, а затем приостанавливаться на 5 секунд из-за yield return new WaitForSeconds(5f);. Вы должны использовать OnColliderEnter, иначе может быть лучше использовать OnTriggerEnter, потому что этот будет звонил один раз. Затем измените значение внутри вызова WaitForSeconds на 1, если вы хотите, чтобы это происходило один раз в секунду.

Также, как указано в Draco18s, ваша доходность ничего не ждет. Вы должны сделать что-то вроде этого:

IEnumerator enemyIsAttacking()
{
    var deskHealth = Desk.GetComponent<DeskHealth>();
    while(collidingWithDesk)
    {
        deskHealth.DealDamageToDesk(damageDealtToDesk);
        yield return new WaitForSeconds(1f);        
    }
}

void OnTriggerExit(Collider otherCollider)
{
    if (otherCollider.tag == "Desk")
    { 
        collidingWithDesk = false;
        // rest of your code
    }
}
7
задан Community 23 May 2017 в 12:09
поделиться

7 ответов

& версия представляет ссылку, в то время как * версия представляет указатель. Разница слишком велика для типичного поста SO. Я предлагаю вам начать с C ++ FAQ

http://www.parashift.com/c++-faq-lite/references.html

Я обычно не люблю отвечать на посты с надписью «вы должны использовать Google " ответ. Однако это одна тема, которую я настоятельно советую вам Google. В частности, Google "c ++ указатели против ссылок". По этой теме доступно огромное количество информации, и обсуждения на этих страницах превзойдут все, что мы напишем здесь.

20
ответ дан 6 December 2019 в 05:56
поделиться

Класс * может указывать на любой объект класса или ни на один.

A Класс & всегда указывает на ровно один объект класса и никогда не может указывать на другой объект.

Кроме того, я считаю, что Бьярне является членом группы людей, которые утверждают, что массивы в C разбиты за пределы ремонт, "класс * может указывать на весь массив ding-dang объектов класса, расположенных один за другим в памяти, и в C нет абсолютно никакого способа определить, указывает ли класс * на один или много.

5
ответ дан 6 December 2019 в 05:56
поделиться

* является указателем, а & является ссылкой. Разница между ними заключается в том, что указатель является областью памяти, на которую необходимо разыменовать, например. с помощью оператора -> для того, чтобы его «видели» как экземпляр класса. Вместо этого ссылка - это «псевдоним», просто альтернативное имя для того же экземпляра класса. Вам не нужно использовать оператор -> со ссылкой. Вы используете оператор точки.

Лично я редко использовал ссылки, в основном, когда у меня был объект значения, который я выделил в стеке. Оператор new всегда возвращает указатель, который вы затем должны разыменовать. Кроме того, одна из самых проблемных проблем ссылок - то, что вы не можете установить их в NULL. В некоторых случаях удобно иметь функцию, которая принимает либо указатель объекта, либо NULL.

6
ответ дан 6 December 2019 в 05:56
поделиться

Другое отличие состоит в том, что ссылочные переменные должны быть инициализированы. Вы не можете создать ссылочную переменную, как показано в примере кода. Это приведет к ошибке компилятора.

0
ответ дан 6 December 2019 в 05:56
поделиться

One additional tip that I would offer is the following:

Use references when you can, pointers when you have to. If the object is guaranteed to exist, you should probably use a reference. If it is not, then you probably have to use a pointer.

One additional advantage is that references remove ambiguity on ownership. As soon as a maintenance programmer sees a pointer, they'll start to wonder if they should delete it.

Check this example out:

// Wrapper class using a reference because the wrapped object always exists
class Wrapper
{
public:
  // If the wrapped is guaranteed to exist at creation, do it this way
  Wrapper(Wrapped& wrapped):_wrapped(wrapped) { /* empty */ }

  // put extra methods here.
  int getWrappedValue() const { return _wrapped.getValue(); }

private:
  Wrapped& _wrapped; // This object always exists and is valid
};

// Wrapper class written to support a possibly non-existent wrapped object.
class Wrapper
{
public:
  Wrapper(Wrapped* wrapped = 0):_wrapped(wrapped) { /* empty */

  void setWrappee(WRappee* wrapped) { _wrapped = wrapped; }

  int getWrappedValue() const; // Not making inline -- more complex

private:
  Wrapped* _wrapped; // Always check pointer before use
};

int Wrapper::getWrappedValue() const
{
  if (_wrapped)
  {
    return _wrapped->getValue();
  }
  else
  {
    return -1; // NOTE, this is a contrived example -- not getting into exceptions
  }
}
0
ответ дан 6 December 2019 в 05:56
поделиться

Как уже говорилось, вы должны гуглить, но во избежание недоразумений:

  • Ссылки НЕ являются переменными
  • Ссылки являются НЕ похож на указатели (но вы можете использовать их аналогичным образом).

Думайте о Ссылке как о сокращении назначенного ему термина.

0
ответ дан 6 December 2019 в 05:56
поделиться

Ссылка (&) - это то же самое, что указатель (*), за исключением того, что компилятор C ++ гарантирует, что он не быть нулевым. Тем не менее, он все еще может быть висящим указателем (переменная-указатель, которая не имеет ссылки, так что она является мусором и недопустима для любого использования).

0
ответ дан 6 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: