C ++ Vector在方法中更改后不更改值

C++ Vector not changing value after being altered in a method

我正在尝试为有向图中的节点创建一个 class(我对它们了解不多,如果我搞砸了任何术语,请原谅)。 每当我将指向 n2 的指针添加到 n1 的 outNodes 向量时,我都希望将指向 n1 的指针添加到 n2 的 inNodes 向量。我希望这是有道理的,这是我的代码。

#include <iostream>
#include <vector>

class Node {
private:
  static int nextId;
  int id;
  std::vector<Node*> ptr_outNodes;
  std::vector<Node*> ptr_inNodes;
public:
  Node() {
    id = nextId++;
  }

  int getId() {
    return id;
  }

  void setInNodes(Node n) {
    ptr_inNodes.push_back(&n);
  }
  void setOutNodes(Node n) {
    ptr_outNodes.push_back(&n);
    n.setInNodes(*this);
  }

  std::vector<Node*> getOutNodes() {
    return ptr_outNodes;
  }

  std::vector<Node*> getInNodes() {
    return ptr_inNodes;
  }
};

int Node::nextId = 0;


int main() {
  Node n1;
  Node n2;

  n1.setOutNodes(n2);
  std::cout << n2.getInNodes().size();
  return 0;
}

如您所见,我将其设置为 return n2 的 inNodes 的大小。当我 运行 程序时,我看到它的大小为 0。如果我在 setInNodes 方法中打印出大小,我得到结果 1,这对我来说很奇怪。另外,如果我将主要功能更改为:

int main() {
  Node n1;
  Node n2;

  n1.setOutNodes(n2);
  n2.setInNodes(n1);
  std::cout << n2.getInNodes().size();
  return 0;
}

我得到结果 1。添加该行表明该函数正在运行,所以我相信当我从 setOutNodes() 调用 setInNodes() 时出现了问题。在过去的半小时里,我一直在盯着这个看,所以如果有人能帮助我,那就太好了,谢谢!

您正在为方法 setInNodessetOutNodes 提供原始 Node 对象的副本。您推入向量的指针是 copy 的地址,而不是原始对象的地址。

要推送原始节点对象的地址,您需要将节点指针传递给函数。

代码:

... // Your Node class code

void setInNodes(Node *n) {
  ptr_inNodes.push_back(n);
}
void setOutNodes(Node *n) {
  ptr_outNodes.push_back(n);
  n.setInNodes(this);
}
...

// in the main function:
n1.setOutNodes(&n2);
n2.setInNodes(&n1);

在您的代码中:

void setInNodes(Node n) {
    ptr_inNodes.push_back(&n);
  }
  void setOutNodes(Node n) {
    ptr_outNodes.push_back(&n);
    n.setInNodes(*this);
  }

您正在按值传递 Node(它是临时的)。然后你将指向临时对象的指针添加到你的向量中。当您的函数 (setxxx) 超出范围时,临时对象将被销毁,因此存储的指针是指向无效对象的指针。 Accessing/dereferencing函数退出后的指针是未定义行为(即程序可以做任何事情)

如其他地方所述,您可以传入指针或引用。

void setXxNode(Node& node)...

通过引用传递是我的选择,因为它需要一个值(显示意图)。然后将引用的地址添加到向量中,但请注意,所引用对象的生命周期必须超过现在持有该指针的对象的生命周期。