Как я случайно перезаписываю при ссылке на эти указатели?

Если вы хотите убедиться, что код внутри подписки выполняется один раз, вы можете использовать take(1) или first()

Пример:

this.service.take(1).subscribe(...);

Также, лучший Практика всегда использовать takeUntil() и уничтожить его, например, в ngOnDestroy

class myComponent {
  private destroyed$: ReplaySubject<boolean> = new ReplaySubject(1);

  constructor(
    private service: Service) {}

  ngOnInit() {
    this.service
      .takeUntil(this.destroyed$)
      .subscribe(...);
  }

  ngOnDestroy() {
    this.destroyed$.next(true);
    this.destroyed$.complete();
  }
}
6
задан Rex M 26 June 2009 в 04:53
поделиться

5 ответов

Другие ответы указали на то, что вызвало ошибку. Как общие рекомендации я предложил бы не использовать ссылки кроме аргументов функции. Семантика сбивает с толку, также для кого-то, который попытается прочитать Ваш код. Попытайтесь переписать к чему-то вроде этого (я не протестировал код):

void deleteNearestPoint(int x, int y)
{
    y = screenHeight - y;

    PolygonList::iterator closestPolygon = polygonList.begin();
    Polygon::iterator closestPoint = closestPolygon->begin();

    float closestDistance = sqrt(pow(x - closestPoint->x, 2) + pow(y - closestPoint->y, 2));

    // Search PolygonList
    PolygonList::iterator listIter;
    Polygon::iterator iter;

    for(listIter = polygonList.begin(); listIter != polygonList.end(); listIter++)
    {
        for(iter = listIter->begin(); iter != listIter->end(); iter++)
        {
            const float distance = sqrt(pow(x - iter->x, 2) + pow(y - iter->y, 2));

            if (distance < closestDistance)
            {
                closestPolygon = listIter;
                closestPoint = iter;
                closestDistance = distance;
            }
        }

    }

    closestPolygon->erase(closestPoint);

    redraw();
}
4
ответ дан 8 December 2019 в 14:47
поделиться
closestPolygon = *listIter;

Вместо этого назовет оператор = () на объекте указанным ссылкой, таким образом, это перезапишет первый полигон со вторым.

Объявите closestPolygon как указатель вместо этого (который может, указал на различные объекты даже после его объявления),

Polygon *closestPolygon = &(polygonList.front());
...
closestPolygon = &(*listIter);
2
ответ дан 8 December 2019 в 14:47
поделиться

К сожалению, Вы не можете снова переплести ссылку, т.е. эту строку:

closestPolygon = *listIter;

скопирует *listIter кому: closestPolygon, не снова переплетают refernece к *listIter.

Править: Чтобы сделать, что Вы хотите, необходимо использовать PolygonList::iterator вместо Polygon & и скорректируйте код соответственно.

6
ответ дан 8 December 2019 в 14:47
поделиться

Я вижу, что на Ваш вопрос уже ответили - я добавлю свои 2 цента и предложу, чтобы Вы сделали расстояние методом Точки для сохранения кода дублирования.

Поскольку другие сказали, что Вы могли бы также хотеть squareDistance (x, y) метод также, если это сделает жизнь легче для Вас.

Любой мог быть встроен, если Вы волнуетесь по поводу издержек вызова функции.

1
ответ дан 8 December 2019 в 14:47
поделиться

Вы не можете присвоить ссылке.
Это - основное различие между ссылками в C++ и ссылками в C# и т.п.. После того как Вы инициализируете ссылочную переменную с объектом, та переменная становится псевдонимом к тому объекту. присвоение ссылочной переменной эквивалентно присвоению исходному объекту. с этим в памяти, этой строкой:

closestPolygon = *listIter;

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

Кроме того, как отмечено кем-то еще, с помощью pow(... , 2) чрезвычайно расточительно. еще лучше запишите что-то вроде этого:

x = a - b;
xsquare = x * x;

Править: Запись этого с указателями запустится с чего-то как этот:

void deleteNearestPoint(int x, int y)
{
    y = screenHeight - y;

    Polygon *closestPolygon = &polygonList.front();
    Polygon::iterator closestPoint = closestPolygon.begin();
3
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

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