Comment puis-je faire une variable statique dépendante instantanée dans une méthode de classe?
-
30-09-2019 - |
Question
J'ai une fonction dans une classe les œuvres plus ou moins comme ceci:
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++;
}
Le problème se pose lorsque vous essayez d'utiliser plus d'un joueur, comme suit:
Player playerone;
Player playerthree;
playerone.Summon(new Object("o1"));
playerthree.Summon(new Object("o2"));
o1
est situé dans playerone.minions[0]
, comme cela est prévu, cependant, o2
est situé dans playerthree.minions[1]
, la fonction de Summon()
en utilisant la même variable i
. Y at-il un moyen de rendre la fonction Summon()
utiliser une variable statique i
pour une seule instance, mais utiliser des variables de i
distinctes pour chaque instance? Je sais que je pouvais faire quelque chose comme faire une boucle de for
au premier endroit à minions[]
égal à NULL
, ou faire i
un membre de Player
directement, mais je veux savoir s'il y a une meilleure façon avant moi soit de ceux-ci.
La solution
Modifier Object* minions[16];
à un std::vector<Object*> minions;
. De cette façon, vous pouvez simplement utiliser minions.size()
de savoir combien il y a, ou minions.push_back(obj);
d'ajouter un sans se soucier des trucs index du tableau.
Autres conseils
Pourquoi ne i
tout simplement pas vous mettre dans chaque Player
? Je renomme quelque chose comme summonned_minion_count
, mais c'est l'intention réelle de ce que vous voulez faire.
Faire une variable statique locale efficace rend globale. Vous devez simplement faire i
un membre de données de class Player
. Et sans doute donner un nom plus descriptif.
Vous devez faire votre i
une variable membre de Player
.
Ou mieux encore, vous pouvez faire quelque chose comme ceci:
#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);
}
}
};