检查数组中的指针是否为空(C++)

3
我有一个指向cPlayer类的指针数组。
编译器:Visual C++ 2010 Express
初始化
cPlayer* players[MAX_PLAYERS];

Max_Players是一个固定值,为10。 这个值在一个名为“OnlineData”的类中定义,在头文件中。

检查

if (players[a]){
   // some code here
}

无论我尝试了什么,它仍然会通过//这里的一些代码。
玩家可以像这样被删除:
players[player->id]=0;
delete player;

问题

我想检查玩家数组中位置a的项目是否有值。我正在使用它来重新排列玩家列表(碎片整理)。

该数组在添加内容方面运作正常,但在我尝试做上述事情时出现了问题。


1
@BhanuKaushik 那不是有效的 C++ 代码。 - Benj
我尝试了,它提示说“==”不能在此实例中使用,或类似的内容。另外,null未定义。 - rubenwardy
@Benj- 我的错,看起来我在错误的帖子里。 - Bhanu Kaushik
@Rubenwardy 你的 delete 看起来有点奇怪,但是贴出的代码不够多不能确定。如果在调用 delete 前将指针设置为 0,那么就会产生泄漏。 - Benj
@Benj,这不是泄漏,player是一个cPlayer,players是一个cPlayer的数组。我从数组中删除了player,然后我删除了player。 - rubenwardy
显示剩余4条评论
5个回答

10

将指针初始化为null指针,可以像这样完成:

cPlayer* players[MAX_PLAYERS] = {};

@Rubenwardy:请提供您正在尝试编译的代码的完整示例。因为我可以非常自信地保证,除非cPlayerMAX_PLAYERS未定义,否则此行代码中没有错误。示例 - Benjamin Lindley
问题在于players是一个类成员。请参考我的答案@Rubenwardy。 - bames53
@Anirudha你是错误的;对于一个普通数组T t[N] = {};会初始化整个数组。请参阅§ 8.5.1/7。 - bames53
@Anirudha:恐怕你错了。每当您为数组提供初始化程序时,所有未指定的元素都将进行值初始化。对于指针,值初始化意味着将其初始化为NULL。 - Benjamin Lindley

8

要初始化全局或本地数组,您可以使用:

cPlayer* players[MAX_PLAYERS] = {};

然而,由于您的数组是类成员,因此无法进行这样的初始化(直到C++11引入了类内初始化,但VS2010不支持此功能)。相反,您必须编写代码,在构造函数体中(或init函数或其他函数)单独初始化每个成员:

struct S {
    cPlayer *players[MAX_PLAYERS];

    S() {
        for (int i=0; i<MAX_PLAYERS; ++i) {
            players[i] = NULL;
        }
    }
};

使用显式循环更好的替代方法是使用 <algorithm> 中的东西,比如 std::fill 或者 std::fill_n:

std::fill_n(players, MAX_PLAYERS, NULL);

感谢大家的快速帮助。 - rubenwardy
1
或者 std :: fill_n(players,10,0) - Anirudha

3

初始化数组:cPlayer * players [MAX_PLAYERS] = {};

该语句用于初始化一个包含最大玩家数的空指针数组。


用{0}初始化并检查它? - Rahul Tripathi
1
在这种情况下,{}{0}将执行相同的操作。我认为使用{0}是一个坏主意,因为我不断听到一些人错误地认为{x}会用x初始化每个元素,而他们从{0}那里得到了这个想法。事实上,当你用少于聚合体包含的项目列表初始化聚合体时,所有剩余的元素基本上都被值初始化。所以{0}0初始化第一个元素和所有其余元素的值初始化;在这种情况下,它恰好与0相同,但不必如此。 - bames53
@bames53:非常感谢分享这个观点。现在我对它有了更清晰的认识 :) - Rahul Tripathi

1

将数组的所有值初始化为NULL(在 <cstdlib> 中找到)。然后,当您想要为数组中的一个位置分配一个值时,请编写:players[i]=new cPlayer(...)。要检查位置a是否为空,请简单地检查players[a]==NULL


0

使用

std::fill_n(players, 10, 0)

将所有成员初始化为0。


@Rubenwardy 希望现在有所帮助 - Anirudha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接