如何修复此错误在代码行35上发生

时间:2019-05-11 20:08:13

标签: c++ visual-studio class pointers vector

这是output with the error

这是我的作业文本:

  

考虑由节点和一个方向链接组成的网络。   每个节点将由一个字符表示,并且每个链接都有一个   整数成本值。

因此,当所有节点只有一个链接时,它会起作用,但是当我包含一个节点的多个链接时,它将不起作用。

#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 个答案:

答案 0 :(得分:2)

A.connect(C, 3);

connectnext节点作为参考,但是将其放入nextNodes时,nextNodes会创建一个副本。这意味着在A.connect(C, 3);C.connect(B, 4);之后。 A中的C与C不同,并且不了解B。C的此副本在nextNodes中没有节点,因此

Node next = currentNode.nextNodes[0];

冒险进入不确定的行为。在您的情况下,行为是它不起作用。意味着什么。

解决方案:A必须包含对C的引用,而不是其副本。您将必须熟悉指针或引用包装的用法,因为您无法将引用放入vector中。