我在一个类中有一个函数或多或少的工作如下:
class Player {
private:
Object* minions[16]
public:
void Summon(Object* obj);
};
Player::Summon(Object* obj) {
static int i = 0;
if (i == 16)
return;
minions[i] = obj;
i++;
}
尝试使用多个播放器时会出现问题:
Player playerone;
Player playerthree;
playerone.Summon(new Object("o1"));
playerthree.Summon(new Object("o2"));
o1
位于playerone.minions[0]
,正如预期的那样,o2
位于playerthree.minions[1]
,Summon()
函数使用相同的i
Summon()
变量。有没有办法让i
函数对单个实例使用静态i
变量,但是为每个实例使用单独的for
变量?我知道我可以做minions[]
循环到NULL
中等于i
的第一个点,或者让Player
直接成为{{1}}的成员,但我想知道在我做其中任何一个之前是否有更好的方法。
答案 0 :(得分:2)
将Object* minions[16];
更改为std::vector<Object*> minions;
。这样你就可以使用minions.size()
知道有多少,或minions.push_back(obj);
添加一个而不用担心数组索引的东西。
答案 1 :(得分:1)
为什么不简单地将i
放在每个Player
中?我将它重命名为summonned_minion_count
,但这是你想要做的事情的实际意图。
答案 2 :(得分:0)
您需要将i
成为Player
的成员变量。
或者甚至更好,你可以做这样的事情:
#include <vector>
class Player {
private:
static int const MAX_MINION_COUNT = 16;
std::vector<Object *> minions;
public:
void Summon(Object* obj) {
if (minions.size() < MAX_MINION_COUNT) {
minions.push_back(obj);
}
}
};
答案 3 :(得分:0)
使局部变量静态有效地使其成为全局变量。您只需将i
设为class Player
的数据成员即可。并且可能给它一个更具描述性的名称。