Как исправить эту ошибку, которая произошла на 35-й строке кода - PullRequest
0 голосов
/ 11 мая 2019

Это вывод с ошибкой .

А это мой домашний текст:

Подумайте о сети, которая состоит из узлов и однонаправленных ссылок.Каждый узел будет представлен символом, а каждая ссылка имеет целочисленное значение стоимости.

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

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

class Node {
public:
    char nodeChar;
    int cost;

    Node(char nodeChar) {
        this->nodeChar = nodeChar;
    }

    vector<Node> nextNodes;

    void connect(Node &next, int cost) {
        next.cost = cost;
        this->nextNodes.push_back(next);
    }
};

int main() {
    Node A('A'), B('B'), C('C'), D('D');
    A.connect(C, 3); // A[0] = C
    C.connect(B, 4); // C[0] = B
    B.connect(A, 2); // B[0] = A
    C.connect(D, 5); // C[1] = D
    D.connect(B, 6); // D[0] = B

    int sum = 0;
    Node currentNode = A;

    while (sum < 15) {
        cout << currentNode.nodeChar;
        Node next = currentNode.nextNodes[0];
        currentNode = next;
        sum += next.cost;
    }

    cout << endl;
    system("pause");
}

1 Ответ

2 голосов
/ 11 мая 2019

В

A.connect(C, 3);

connect принимает узел next в качестве ссылки, но когда он помещает его в nextNodes, nextNodes делает копию. Это означает, что после A.connect(C, 3); и C.connect(B, 4);. C в A отличается от C и ничего не знает о B. Эта копия C не имеет узлов в nextNodes, поэтому

Node next = currentNode.nextNodes[0];

решается на неопределенное поведение. В вашем случае это поведение , оно не работает. Что бы это ни значило.

Решение: A должен содержать ссылку на C, а не его копию. Вам придется ознакомиться с использованием указателей или упаковщиков ссылок, потому что вы не можете помещать ссылки в vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...