Как я могу сделать мгновенную зависимость статической переменной в методе класса? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть функция в классе, более или менее работает так:

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 напрямую, но я хочу знать, есть ли лучший задолго до того, как я это сделаю.

Ответы [ 4 ]

2 голосов
/ 03 декабря 2010

Измените Object* minions[16]; на std::vector<Object*> minions;. Таким образом, вы можете просто использовать minions.size(), чтобы узнать, сколько их, или minions.push_back(obj);, чтобы добавить его, не беспокоясь о содержимом индекса массива.

1 голос
/ 03 декабря 2010

Почему бы вам просто не поставить i в каждый Player? Я бы переименовал его в что-то вроде summonned_minion_count, но это реальная цель того, что вы хотите сделать.

0 голосов
/ 03 декабря 2010

Создание локальной статической переменной фактически делает ее глобальной. Вы должны просто сделать i членом данных class Player. И, возможно, дайте ему более описательное имя.

0 голосов
/ 03 декабря 2010

Вам необходимо сделать вашу 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);
        }
    }
};
...