Я впервые использую библиотеку Boost и сталкиваюсь с проблемой при попытке добавить ребра в график. Целью моего приложения является расширение сегментов в изображении и хранение пересечений в структуре графа (как вершины) для дальнейших операций в дальнейшем. У меня есть класс, представляющий полусегмент, расширяющийся в направлении. В этом классе я хочу сохранить vertex_descriptor, соответствующий последнему пересечению, в котором был задействован этот полусегмент, поэтому при создании нового пересечения я могу добавить ребро в графе между последним пересечением и новым.
Вот мой класс Primitive, соответствующий расширяющемуся полусегменту:
class Primitive {
//...
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor m_lastIntersection;
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor lastIntersection() const {
return m_lastIntersection;
}
void setLastIntersection(const adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor &value){
m_lastIntersection = value;
}
};
Класс GraphVertex, используемый здесь, просто моделирует пересечение. У него есть конструктор по умолчанию и конструктор копирования (для информации, поскольку отсутствие их было источником предыдущей ошибки с Boost).
Вот мое определение типа Graph и создание:
typedef adjacency_list<listS, listS, undirectedS, GraphVertex> GRAPH;
GRAPH m_g;
Теперь к проблеме : у меня нет проблем с добавлением вершин в мой график, но когда я пытаюсь добавить ребра, используя lastIntersection, сохраненный в Примитиве, программа вылетает (без сообщения об ошибке). Другие дополнения работы края. Например:
//Works fine
GraphVertex cornerUpperLeft(-1, -1, Point2f(2, 2));
GraphVertex cornerUpperRight(-2, -2, Point2f(image.cols - 3, 2));
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor vd_cornerUpperLeft = add_vertex(cornerUpperLeft, m_g);
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor vd_cornerUpperRight = add_vertex(cornerUpperRight, m_g);
add_edge(vd_cornerUpperLeft, vd_cornerUpperRight, m_g);
Пока:
//Doesn't work
GraphVertex v(...);
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor vertexDescriptor = add_vertex(v, m_g);
//m_primitives is a vector containing all my Primitive objects
add_edge(m_primitives[0].lastIntersection(), vertexDescriptor, m_g);
Вот как я устанавливаю параметр m_lastIntersection для Примитива:
GraphVertex v(...);
adjacency_list<listS, listS, undirectedS, GraphVertex>::vertex_descriptor vertexDescriptor = add_vertex(v, m_g);
primitive.setLastIntersection(vertexDescriptor);
Что я делаю неправильно? Хранение vertex_descriptor таким образом не возможно / плохая практика? Что мне лучше использовать для хранения «идентификатора» вершин в моем графе, если это так?
Заранее спасибо.