Как скопировать вектор списков?

0

В моей программе мне нужно скопировать (или даже использовать) private структуру данных в.cpp файл совершенно другого класса. В настоящий момент у меня даже возникают проблемы с простое обращение к нему удаленно, это происходит, когда я пытаюсь его распечатать. Вот упрощенная версия моего класса со структурой данных:

class Graph
{
private:
    class Edge
    {
    public:
        Edge(string vertex, int weight)
        {
            m_vertex = vertex;
            m_weight = weight;
        }
        ~Edge(){}
        string m_vertex;
        int m_weight;
    };
    vector< list<Edge> > adjList;
public:
    Graph();
    ~Graph();
    vector < list < Edge > > get_adjList(){return adjList;}
    //Other functions....

};

В совершенно другой функции я пытаюсь это сделать...

void MinPriority::testPrint(string targetVertex) //FOR TESTING PURPOSES SO FAR (FAILS TO WORK) SEGMENTATION FAULT NO MATTER WHAT
{

    targetVertex = "A";
    Graph graph;
    graph.adjList = graph.get_adjList(); //adjList is our empty container based on the array of linked lists
    /*1*/cout << graph.get_adjList()[0].front().m_vertex << " TEST!" << endl;

    /*2*/cout << "The very first vertex is: ";
    if(graph.adjList.size() == 0)
        cout << "NULL<!>" << endl;
    else cout << graph.adjList[0].front().m_vertex << endl;
}

Обратите внимание: я устанавливаю targetVertex в 'a', поэтому моя программа компилируется с im, включая -Werror в мой make файл (требуется для назначения). Когда я комментирую /*1*/ и заканчиваюсь до /*2*/ вывод всегда будет "The very first vertex is: NULL<!>", Независимо от того, сколько элементов находится в структуре данных. В /*1*/ Я пытаюсь распечатать объект, возвращенный функцией get_adjList() но это seg get_adjList() читая это:

Exception: STATUS_ACCESS_VIOLATION at eip=611298C5
eax=0A0A0A0A ebx=01010101 ecx=20050884 edx=F5F5F5F5 esi=20058488 edi=20060000
ebp=0028A8D8 esp=0028A8D0 program=C:\cygwin\home\Ryan\311\P5Dec16\Graph.exe, pid 5612, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
0028A8D8  611298C5  (20058400, 0000000A, 20058488, 610FD3CA)
0028A938  6115F91F  (0028D41C, 61187720, 0028A958, 0043455D)
0028A988  61137BF7  (0028D41C, 20058400, 00000001, 20058488)
0028A9B8  61137CD5  (20058400, 00000001, 20058488, 61187720)
0028A9D8  610D6745  (00449240, 20058400, 20058488, 004493C4)
0028AA68  004439BA  (004493C0, 6123D5FC, 004452B4, 0028AAA0)
0028AB08  00402756  (0028AC20, 0028ABB0, 20010100, 004011C1)
0028AC68  00401583  (00000001, 0028AC90, 20010100, 612757A2)
0028ACF8  6100763A  (00000000, 0028CD78, 61006C50, 00000000)
End of stack trace
Segmentation fault (core dumped)

В общем, я хотел бы знать, что это за трассировка стека (у меня были seg ошибки раньше, но я никогда не видел этого). Я хотел бы знать, как правильно получить доступ к структуре данных из класса Graph в других файлах, которые #include "Graph.h". Я также не уверен, как скопировать мой объект внутри testPrint(); , Почему это прекрасно работает в Graph.cpp?

void Graph::set_array(string vertex)
{
    //increment vector size by 1 and insert a new Edge object into the vector of linked lists
    cout << "ADDING " << vertex << " TO VECTOR" << endl;
    adjList.resize(adjList.size() + 1);
    adjList[adjList.size() - 1].push_back(Edge(vertex, 0));
}
  • 0
    Что делает конструктор по умолчанию для Graph ?
  • 0
    в нем нет ничего Graph::Graph() { } деструктор также пуст.
Показать ещё 2 комментария
Теги:
data-structures
oop
vector
copy

1 ответ

1
Лучший ответ
Graph graph;

Как вы сказали, конструктор по умолчанию Graph ничего не делает. Итак, на данный момент graph.adjList пуст.

graph.adjList = graph.get_adjList();

Это бессмысленное утверждение, которое присваивает graph.adjList из копии самого себя. Поскольку он был пуст раньше, он все еще пуст.

cout << graph.get_adjList()[0].front().m_vertex << " TEST!" << endl;

Это пытается получить доступ к первому элементу (копия) graph.adjList. Но graph.adjList пуст (т.е. он не имеет первого элемента), поэтому это неопределенное поведение. Это может быть или не быть причиной вашего segfault, но это, безусловно, проблема, которая должна быть исправлена до того, как может произойти любая дополнительная полезная отладка.

  • 0
    что должна содержать структура графа? вектор списков?
  • 0
    @ user3040019: Боюсь, я не понимаю этот вопрос или, по крайней мере, у меня недостаточно информации о вашей проблеме, чтобы понять, как на нее ответить.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню