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() 时出现了问题。在过去的半小时里,我一直在盯着这个看,所以如果有人能帮助我,那就太好了,谢谢!
您正在为方法 setInNodes
和 setOutNodes
提供原始 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)...
通过引用传递是我的选择,因为它需要一个值(显示意图)。然后将引用的地址添加到向量中,但请注意,所引用对象的生命周期必须超过现在持有该指针的对象的生命周期。
我正在尝试为有向图中的节点创建一个 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() 时出现了问题。在过去的半小时里,我一直在盯着这个看,所以如果有人能帮助我,那就太好了,谢谢!
您正在为方法 setInNodes
和 setOutNodes
提供原始 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)...
通过引用传递是我的选择,因为它需要一个值(显示意图)。然后将引用的地址添加到向量中,但请注意,所引用对象的生命周期必须超过现在持有该指针的对象的生命周期。