C ++使用foreach使数组为空

时间:2018-11-01 07:18:55

标签: c++ arrays foreach null

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循环中取消引用节点,但这会导致段错误。

有人知道怎么了吗?谢谢。

3 个答案:

答案 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 } 将更改该值,否则,您将尝试取消引用不是指针的参数。