Node* nodes[3];
for (Node* eachNode:nodes) {
eachNode = 0; //if i try to dereference it gives seg fault
} // eg. *eachNode = 0;
if (nodes[0] == 0) {
cout << "Null";
} else
cout << "Not null";
cout << '\n';
Node* nodes2[3];
for (int i = 0; i < 3; ++i) { //this way works fine
nodes2[i] = 0;
}
if (nodes2[0] == 0) {
cout << "Null";
} else
cout << "Not null";
大家好,我正在尝试使数组中的所有对象都等于null。使用for循环时,它可以正常工作,但是当我使用foreach循环时,它会中断。
我得到的输出是
不为空
空
我认为我必须在foreach循环中取消引用节点,但这会导致段错误。
有人知道怎么了吗?谢谢。
答案 0 :(得分:4)
您编写的循环遍历数组的值:
for (Node* eachNode:nodes) {
eachNode = 0;
}
上面的循环也可以使用auto
来编写:
for (auto eachNode:nodes) {
eachNode = 0;
}
上述循环的问题是eachNode
不是存储在数组中的指针,而是存储在循环的局部变量中的该指针的副本。
如果您希望将节点设置为空,则您需要引用要设置该节点的内存位置。您可以通过使用auto&
引用数组元素来获得该引用:
for (auto& eachNode:nodes) {
eachNode = 0;
}
最后一段可能会满足您的要求。
答案 1 :(得分:2)
我相信您应该尝试:
for(Node *&eachNode : nodes) {
eachNode = nullptr;
}
通过这种方式,您可以获得与值相反的引用,并且可以将其适当地设置为nullptr
。
我不是C ++ 11的超级专家,但我确实读过here,以获取有关此新范围构造的更多信息。
答案 2 :(得分:0)
指针按值传递。因此,设置val statusType: ReturnASealedClass
get() = when (statusIsAnIntFrom1To9FromTheApi) {
1 -> ChildObject1
2 -> ChildObject2
3 -> ChildObject3
4 -> ChildObject4
5 -> ChildObject5
6 -> ChildObject6
7 -> ChildObject7
8 -> ChildObject8
9 -> ChildObject9
else -> throw IllegalStateException("Status not supported")
}
val isOpenOrClosed
get() = when (statusType) {
ChildObject1,//All these Object inherit from FatherObject
ChildObject2
ChildObject3 -> IamAnEnumWithTwoStatesOpenORCLoses.CLOSED
else -> IamAnEnumWithTwoStatesOpenORCLoses.OPEN
}
将更改该值,否则,您将尝试取消引用不是指针的参数。