Добавление ребра с использованием дескриптора вершины, сохраненного в программе сбоя объекта - PullRequest
0 голосов
/ 21 февраля 2020

Я впервые использую библиотеку 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 таким образом не возможно / плохая практика? Что мне лучше использовать для хранения «идентификатора» вершин в моем графе, если это так?

Заранее спасибо.

...