如何检查数组中的某些内容在C ++中是否有效

时间:2015-07-13 19:38:44

标签: c++ arrays pointers null initialization

我初始化一个实体指针数组并添加这样的实体......

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方法添加到Entity类中,我甚至尝试给它一个公共布尔值并在构造函数中将其设置为true,但最终没有办法检查任何关于这些“无效实体”之一的数据而没有获得例外。因此,在尝试对其进行任何操作之前,我需要先了解一个实体是否有效。但是如何?

2 个答案:

答案 0 :(得分:6)

不,你不能用元素2-16做任何因为那些是无效的指针。你甚至没有将它们设置为NULL。它们只是无效的指针。你不能通过它们或其他任何东西调用任何函数。

您可以使用指针值nullptr来表示“未填充”数组位置,但老实说,您应该使用std::vector<std::unique_ptr<Entity>>存储指向良好数据的好指针并且没有“未填充”数组职位。载体将根据需要增长。

实际上,即使你所谓的“有效”数组元素也悬挂在临时指针上,因此根本不会“有效”。我讨厌Visual Studio允许这样做:根据标准的规则,这个程序甚至不应该编译。

答案 1 :(得分:0)

您需要确保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作为容器而不是内置数组,以及智能指针而不是原始指针。