Проблема с указателями и ссылками в C ++ - PullRequest
2 голосов
/ 13 февраля 2009

У меня есть PolygonList и тип Polygon, которые представляют собой std :: lists of points или списки списков точек.

class Point {
    public:
        int x, y;
        Point(int x1, int y1)
        {
            x = x1;
            y = y1;
        }
};

typedef std::list<Point> Polygon;
typedef std::list<Polygon> PolygonList;


// List of all our polygons
PolygonList polygonList;

Однако я запутался в ссылочных переменных и указателях.

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

Итак, я попытался установить фронт PolygonList в Polygon с именем currentPolygon, например:

 Polygon currentPolygon = polygonList.front();
 currentPolygon.push_front(somePoint);

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

Это работает, если я сделаю это:

polygonList.front().push_front(somePoint);

Почему они не одинаковы и как я могу создать ссылку на физический передний многоугольник, а не его копию?

Ответы [ 3 ]

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

как это:

 Polygon &currentPolygon = polygonList.front();
 currentPolygon.push_front(somePoint);

знак & перед именем означает, что это ссылка.

1 голос
/ 18 апреля 2010
 Polygon currentPolygon = polygonList.front();

Поскольку класс Polygon не перегружает оператор присваивания, компилятор делает это за вас и создает экземпляр в этой строке.

Поведение по умолчанию оператора присваивания, реализованное в версии, представленной таким образом компилятором, заключается в создании копии объекта.

0 голосов
/ 13 февраля 2009

Вероятно, вы должны определить свой список как список указателей:

typedef std::list<Point> Polygon;
typedef std::list<Polygon*> PolygonList;

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

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