2009-02-13 2 views
2

У меня есть PolygonList и тип Polygon, которые являются std :: списками точек или списками списков точек.Проблема с указателями и ссылками в C++

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 к Многоугольник называется currentPolygon так:

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

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

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

polygonList.front().push_front(somePoint); 

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

ответ

6

так:

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

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

+0

Так что, когда я объявляю это, мне нужно только «&», но не каждый раз после того, как я его использую? – KingNestor

+0

& is является частью типа: «Polygon &». Таким образом, вам нужно только время объявления. –

+0

Большинство стилей C++ пытаются присоединить модификаторы типа к типу: то есть «Polygon & current», даже если фактический синтаксис является типом, за которым следует измененное имя (следовательно, [] после имени и линейный шум для указателей функций) –

0

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

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

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

+0

Я верю most std :: list реализует неглубокую копию или по крайней мере std :: swap(). –

1
Polygon currentPolygon = polygonList.front(); 

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

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

Смежные вопросы