大家好,
我一直在尝试以下代码,将列表中的所有指针重置为nullptr,如下所示:
for (auto item : { ptr1, ptr2, ptr3 })
item = nullptr;
问题是指向项目的指针的副本,因此原始ptrs在结尾处不等于nullptr。
我想获得对指针本身的某种引用,或者也许已经有更好的替代方法,将容器中的所有指针设置为nullptr。如果您碰巧与Qt一起工作,也许在Qt中有一个很好的方法吗?预先感谢!
答案 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;