使用基于范围的for循环遍历指针列表

时间:2020-10-09 12:13:36

标签: c++ qt pointers

大家好,

我一直在尝试以下代码,将列表中的所有指针重置为nullptr,如下所示:

    for (auto item : { ptr1, ptr2, ptr3 })
        item = nullptr;

问题是指向项目的指针的副本,因此原始ptrs在结尾处不等于nullptr。

我想获得对指针本身的某种引用,或者也许已经有更好的替代方法,将容器中的所有指针设置为nullptr。如果您碰巧与Qt一起工作,也许在Qt中有一个很好的方法吗?预先感谢!

2 个答案:

答案 0 :(得分:4)

如果要键入各个指针变量,为什么不只使用链式分配呢?

ptr1 = ptr2 = ptr3 = nullptr;  // All three pointers are nullptr.

DEMO


[...]或者也许已经有更好的替代方法,将容器中的所有指针设置为nullptr

如果与单独的命名指针变量相比,您的指针位于实际的容器中,则可以使用基于范围的for循环来写入和读取容器的指针元素:

#include <array>
#include <ios>
#include <iostream>

// Container of 'pointer-to-const-int' elements.
using MyPointersArray = std::array<int const*, 3>;

void inspectNullptrness(const MyPointersArray& arr) {
    for (const auto& p : arr) {
        std::cout << std::boolalpha 
            << (p == nullptr) << " ";
    }
}

int main() {
    MyPointersArray pointers{nullptr, nullptr, nullptr};
    const int a = 42;
    inspectNullptrness(pointers); // true true true
    
    // Set pointers.
    for(auto& p : pointers) { p = &a; }
    inspectNullptrness(pointers); // false false false
    
    // Reset pointers.
    for(auto& p : pointers) { p = nullptr; }
    inspectNullptrness(pointers); // true true true
}

答案 1 :(得分:2)

我想获得一些参考

您正在使用该大括号的初始化列表创建一个std::initializer_list。不幸的是,这样的列表总是包含副本,并且您不能通过该列表分配用于初始化它的变量。

您可以使用参考包装:

for (auto ref : { std::ref(ptr1), std::ref(ptr2), std::ref(ptr3) })
    ref.get() = nullptr;

如果您使用指针数组而不是单独的变量,那么遍历它们将是微不足道的:

T* ptrs[3];
for (auto& ptr : ptrs})
    ptr = nullptr;