如何检查数组中的某些内容在c++中是否有效
How to check if something in an array is valid in C++
我初始化了一个实体指针数组,并像这样添加实体…
Entity* ents[16];
Player* player = &Player(20, 24); // subclass of entity
Player* player2 = &Player(30, 30);
ents[0] = player;
ents[1] = player2;
我用16作为它们的大小来循环,因为我已经知道了。
但是我不能对他们做任何事情…因为其中一些是不"有效的"。我不能在实体2-16上运行任何方法,因为我没有设置它们是什么。Visual Studio总是因为一个异常而抓狂。所以我尝试添加一个isValid方法到实体类,我甚至尝试给它一个公共布尔值,并在构造函数中将其设置为true,但最终没有办法检查这些"无效实体"之一的任何数据而不会得到异常。所以在我尝试对实体做任何事情之前,我需要能够先找出它是否有效。但如何?
不,你不能对元素2-16做任何操作,因为它们是无效指针。你甚至没有把它们设为NULL。它们只是无效的指针。您不能通过它们调用任何函数或其他任何东西。
您可以使用指针值nullptr
来指示"未填充"的数组位置,但是,老实说,您应该使用std::vector<std::unique_ptr<Entity>>
来存储指向良好数据的良好指针,并且根本没有"未填充"的数组位置。向量将根据需要增长。
实际上,即使是所谓的"有效"数组元素也是指向临时对象的悬空指针,因此在任何方面都不是"有效"的。我讨厌Visual Studio允许这样做:根据标准规则,这个程序甚至不应该编译。
您需要确保ents
数组中未初始化的元素与初始化的值是可区分的。例如:
Entity* ents[16];
Player* player = &Player(20, 24); // subclass of entity
Player* player2 = &Player(30, 30);
ents[0] = player;
ents[1] = player2;
for (size_t i = 2; i < 16; i++)
ents[i] = 0;
// then elsewhere, you can use
size_t j = 12;
if (ents[j])
{
// do something with ents[j] because it has a valid pointer
}
但请注意,这是对你的简单问题的简化回答。一般来说,您应该将std::vector
用于容器而不是内置数组,使用智能指针而不是原始指针。
相关文章:
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 我如何知道作为参数的size_t在函数中是否有效?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 此递归模板类型定义是否有效C++?
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 如何检查输入是否有效?
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 堆分配对于大型块中的分页是否更有效?
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 如何检查isupper(cstr)是否有效?