vector.push_back не работает! [Ошибка выполнения] - PullRequest
0 голосов
/ 08 ноября 2018

Я искал в Интернете решение, но пока не нашел его.

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

node.connections.size() 

возвращает 0, что, насколько я знаю, означало бы, что вектор пуст. Это странно, так как он вызывается примерно 20 раз перед проверкой размера. Это подтверждается еще и тем, что звонят:

n.nodes[0].connections[0];

приводит к ошибке во время выполнения.

Самое странное, что он работает только тогда, когда я вызываю его в методах узла (например, в его конструкторе)

Редактировать: вместо исходного кода, вот «Минимальный, полный, проверяемый пример»:

 #include <iostream>
 #include <vector>
 using namespace std;

 class Edge;

 class Node
 {
    public:
    int x, y;

    vector <int> connections;

    Node(): x(0), y(0) {};
    Node(int a, int b)
    {
        x= a;
        y = b;
        cout << "New node!\n";
    }
    void AddConnection(int n)
    {
        connections.push_back(n);
        cout << "Pushing connection...\n";
    }
  };

  class Edge
  {
 public:
Node nStart, nEnd;

   Edge(Node A, Node B)
   {
       nStart = A;
       nEnd = B;

       nEnd.AddConnection(1);
       nStart.AddConnection(1); //Every edge should input at least 2 ints.

       std::cout<< "New edge!"  <<"\n";

    };
};
 class Network
{
    public:
    vector <Node> nodes;
    vector <Edge> edges;

    void AddEdge(Edge newEdge)
    {
      edges.push_back(newEdge);
    }
    void AddNode(Node newNode)
    {
       nodes.push_back(newNode);
    }

};


int main()
{
   Network n;

   n.AddNode(Node(4,4));
   n.AddNode(Node(1,1));
   n.AddNode(Node(1,2));

   n.AddEdge(Edge(n.nodes[0], n.nodes[1]));
   n.AddEdge(Edge(n.nodes[1], n.nodes[2]));
   n.AddEdge(Edge(n.nodes[0], n.nodes[2]));

   cout << "Number of connections: " <<n.nodes[0].connections.size();

  //Uncommenting this will cause a runtime crash:
  //int j = n.nodes[0].connections[0];
  /*You can also change the connections[0] to [1] or maybe more, it will crash anyway*/

   return 0;
}

1 Ответ

0 голосов
/ 08 ноября 2018
  class Edge
  {
 public:
Node nStart, nEnd;
...

Поскольку каждый Edge имеет свои два Node объекта, абсолютно невозможно, чтобы Node мог принадлежать более чем одному Edge. Это не нормальный способ представления узлов и ребер. Ребро должно ссылаться на два уже существующих узла, а не создавать два новых узла только для этого ребра.

...