Comment puis-je faire une variable statique dépendante instantanée dans une méthode de classe?

StackOverflow https://stackoverflow.com/questions/4340792

  •  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.

Était-ce utile?

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);
        }
    }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top