Проблема с указателем в C ++ - PullRequest
1 голос
/ 21 марта 2010

_stuckVertices - массив указателей, и я хотел бы обновить один индекс этого массива, не используя _stuckVertices[ (row * _cols) + column ] 3 раза. Причина, по которой это массив указателей, заключается в том, что в большинстве случаев указатель будет равен NULL. Следующий код работает, но мне нужно разыменовывать a каждый раз, когда я его использую:

void Cloth::stickPoint(int column, int row)
{
    Anchor **a = &_stuckVertices[ (row * _cols) + column ];
    if (!*a)
        *a = new Anchor(this, column, row);
    (*a)->stick();
}

Первоначально я написал это так, но указатель _stuckVertices не обновляется:

void Cloth::stickPoint(int column, int row)

    {
        Anchor *a = _stuckVertices[ (row * _cols) + column ];
        if (!a)
            a = new Anchor(this, column, row);
        a->stick();
    }

Есть ли способ написать Anchor *a = _stuckVertices[ index ] так, чтобы a походил на псевдоним в массиве, который я могу обновить, или был как первый фрагмент кода, как мне это сделать?

Спасибо

Ответы [ 2 ]

4 голосов
/ 21 марта 2010

Ссылки - это то, что вы ищете - это псевдонимы:

Anchor*& a = _stuckVertices[ (row * _cols) + column ];
if (!a)
    a = new Anchor(this, column, row);
a->stick();
0 голосов
/ 21 марта 2010

_stuckVertices - это массив указателей

Что вы подразумеваете под этим? Неужели Ою создал это так: Anchor * _stuckVertices = новый Anchor [Number]; или вот так: Anchor * _stuckVertices [Number] = {0};

В первом случае вы сможете это сделать:

Anchor *a = _stuckVertices +((row * _cols) + column);
a->stick();

Во втором случае:

Anchor *a = _stuckVertices[((row * _cols) + column)];
a->stick();

И просто подсказка, (строка * _cols) + столбец может быть больше длины массива Вы должны по крайней мере добавить утверждение перед доступом к _stuckVertices, например ::1013*

#include <cassert>
assert (sizeof(_stuckVertices)/sizeof(_stuckVertices[0]) > ((row * _cols) + column) );

С уважением, Валентин Хайниц

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