Я инициализирую свои ссылочные переменные C++ правильно?

Я нашел решение своей проблемы. Каждый раз, когда срабатывает событие @after-enter, я проверяю, совпадает ли индекс с размером списка appointment_. Когда результат правдив, настало время прокручивать!

Следить за текущим индексом:

<transition-group name="slide" @after-enter="afterEnter">
  <div
    v-for="(list, key, index) in appointments_"
    v-bind:key="key"
    v-bind:data-index="index"
  >
    <!-- Content -->
  </div>
</transition-group>

Код, который прокручивает компонент в поле зрения:

methods: {
  afterEnter(element) {
    if (this.appointments_.length === Number(element.dataset.index) + 1) {
      VueScrollTo.scrollTo(`#appointment_${this.selectedDate_}`, 500, { offset: -60 });
    }
  },
},
16
задан Agostino 5 March 2015 в 22:42
поделиться

6 ответов

Почему вы думаете, что вам вообще нужно использовать новые и ссылки? Почему бы и нет:

Foobar foobar(someArg, anotherArg);

Для вашей функции - вернуть значение:

Foobar helloWorld()
{
    Foobar foobar(someArg, anotherArg);
    foobar.HelloWorld();
    return foobar;
}

или указатель:

Foobar * helloWorld()
{
    Foobar * foobar = new Foobar(someArg, anotherArg);
    foobar->HelloWorld();
    return foobar;
}

Если вы сделаете это - вызывающая сторона ответственна за удаление выделенного объекта в какой-то момент.

Возврат из не- функция-член - это то место, где ссылки обычно не могут использоваться разумно, поскольку то, на что вы хотели бы сослаться, обычно больше не существует.

11
ответ дан 30 November 2019 в 21:54
поделиться

Да, это вонючее!

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

Вы можете сделать ...

const Foobar &foobar = Foobar(someArg, anotherArg);

... если вы действительно хотите ссылку. Обратите внимание, что как только foobar выйдет из области видимости, временный объект, на который он ссылается, умрет. Но в написании не так много смысла, что когда вы можете написать прямо:

Foobar foobar(someArg, anotherArg);

Возможно, вам на самом деле не нужна ссылка ... они обычно (но не исключительно) используются для типов аргументов метода , Это так, что вы можете передать что-то похожее на объект, но имеет только размер указателя и который метод может изменить. Ссылка была введена в первую очередь, чтобы позволить вам написать конструктор копирования (я не буду здесь это объяснять!).

5
ответ дан 30 November 2019 в 21:54
поделиться

Ссылки в C ++ на самом деле не так сильны, как того ожидают люди, я думаю, что путаница исходит от людей, которые привыкли к языкам, таким как Java и C #, которые не имеют указателей и имеют ссылки, которые можно переназначать и использовать.

Ссылка в C ++ обычно лучше всего использовать в качестве псевдонима для переменной, так что вы можете упростить такие вещи, как передача параметров и возвращаемые значения. Есть очень немного ситуаций, когда вы пытаетесь получить ссылку, как вы делаете в первой строке. Поэтому обычно вам не нужно делать то, что вам кажется

3
ответ дан 30 November 2019 в 21:54
поделиться

Вы правильно написали. Но имейте в виду, что странно освобождать ptr с помощью delete & refVar; (это может быть ошибочно принято за переменную, которая не была создана new).

Вы должны проверить GotW на предмет передовой практики, распространяющейся вокруг http: //www.gotw. ca / gotw / Я не помню, какой это был урок (их было больше, чем один), но чтение этого более ценно, чем кто-либо понимает (уловки будут меньше удивлять)

Вы должны попробовать написать код, который НИКОГДА не будет используйте указатели. Я делаю это, но однажды застрял, когда мне был нужен контейнер BaseObj. Там не было работы вокруг этого. Обычно я использовал контейнеры STL и большинство переменных в стеке {MyClass myVar; ...} или как член и передавайте его по мере необходимости.

Его легко удалить указатели, как только вы начнете передавать ссылку вместо указателей и использовать контейнеры stl вместо новых. Обратите внимание, что я никогда не использую auto_ptr. vector, string, deque, list и map должны делать большую часть того, что вам нужно. Есть и другие контейнеры.

Обычно я использовал контейнеры STL и большинство переменных в стеке {MyClass myVar; ...} или как член и передавайте его по мере необходимости.

Его легко удалить указатели, как только вы начнете передавать ссылку вместо указателей и использовать контейнеры stl вместо новых. Обратите внимание, что я никогда не использую auto_ptr. vector, string, deque, list и map должны делать большую часть того, что вам нужно. Есть и другие контейнеры.

Обычно я использовал контейнеры STL и большинство переменных в стеке {MyClass myVar; ...} или как член и передавайте его по мере необходимости.

Его легко удалить указатели, как только вы начнете передавать ссылку вместо указателей и использовать контейнеры stl вместо новых. Обратите внимание, что я никогда не использую auto_ptr. vector, string, deque, list и map должны делать большую часть того, что вам нужно. Есть и другие контейнеры.

2
ответ дан 30 November 2019 в 21:54
поделиться

Нет, вы поняли. Foo & «указывает» на реальный объект, поэтому, если вы действительно хотите ссылку на foo, вы должны разыменовать указатель foo.

@Neil имеет точку, хотя - синтаксически это то, как вы получаете то, что вы хотите, но зачем Вы хотите это?

1
ответ дан 30 November 2019 в 21:54
поделиться

Я бы порекомендовал использовать умный указатель. Вы должны управлять собственностью, и ссылка не сделает этого за вас. На самом деле, для вызывающего абонента будет неясно, есть ли какие-либо проблемы с собственностью. Как отметил Скотт Лэнгхэм в комментарии, std :: auto_ptr будет работать. Лучше было бы использовать shared_ptr из Boost или TR1.

boost::shared_ptr<Foobar> helloWorld()
{
    boost::shared_ptr<Foobar> foobar(new Foobar(someArg, anotherArg));
    foobar->HelloWorld();
    return foobar;
}
1
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

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