如何检查数组中的某些内容在 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 作为大小循环遍历它们,因为我已经知道了。
但我对它们无能为力...因为其中一些不是 "valid"。我不能 运行 实体 2-16 上的任何方法,因为我没有设置它们是什么。 Visual Studio 一直对异常感到恐惧。所以我尝试向实体 class 添加一个 isValid 方法,我什至尝试给它一个 public 布尔值并在构造函数中将其设置为 true,但最终无法检查有关其中一个的任何数据这些 "invalid entities" 毫无例外。因此,在我尝试对它做任何事情之前,我需要能够先确定一个实体是否有效。但是怎么办?
不,您不能对元素 2-16 做 任何事情,因为它们是无效指针。您甚至没有将它们设置为 NULL。它们只是无效的指针。您不能通过它们或其他任何方式调用任何函数。
您可以使用 nullptr
的指针值来指示 "unfilled" 数组位置,但老实说,您应该使用 std::vector<std::unique_ptr<Entity>>
来存储指向良好数据的良好指针并且没有"unfilled" 个数组位置。向量将根据需要增长。
碰巧,即使是所谓的 "valid" 数组元素也是指向临时对象的悬挂指针,因此根本不是 "valid"。我讨厌 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
而不是内置数组,对智能指针而不是原始指针。
我初始化一个实体指针数组并像这样添加实体...
Entity* ents[16];
Player* player = &Player(20, 24); // subclass of entity
Player* player2 = &Player(30, 30);
ents[0] = player;
ents[1] = player2;
我以 16 作为大小循环遍历它们,因为我已经知道了。
但我对它们无能为力...因为其中一些不是 "valid"。我不能 运行 实体 2-16 上的任何方法,因为我没有设置它们是什么。 Visual Studio 一直对异常感到恐惧。所以我尝试向实体 class 添加一个 isValid 方法,我什至尝试给它一个 public 布尔值并在构造函数中将其设置为 true,但最终无法检查有关其中一个的任何数据这些 "invalid entities" 毫无例外。因此,在我尝试对它做任何事情之前,我需要能够先确定一个实体是否有效。但是怎么办?
不,您不能对元素 2-16 做 任何事情,因为它们是无效指针。您甚至没有将它们设置为 NULL。它们只是无效的指针。您不能通过它们或其他任何方式调用任何函数。
您可以使用 nullptr
的指针值来指示 "unfilled" 数组位置,但老实说,您应该使用 std::vector<std::unique_ptr<Entity>>
来存储指向良好数据的良好指针并且没有"unfilled" 个数组位置。向量将根据需要增长。
碰巧,即使是所谓的 "valid" 数组元素也是指向临时对象的悬挂指针,因此根本不是 "valid"。我讨厌 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
而不是内置数组,对智能指针而不是原始指针。