Назначение векторных значений - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над простым проектом игры в кости, который требует от меня создания нескольких экземпляров пользовательского класса.

vector <Player> playerList;

playerList.resize(totalNumPlayers); //totalNum is grabbed from cin

for (int x = 0; x < totalNumPlayers; x++) 
{
    playerList.at(x).setname("Player" + to_string(x + 1));
    //playerList[x] = p;
    playerList.at(x).printName();
    cout << playerList[0].returnName() << " " << playerList[1].returnName() << " " << playerList[2].returnName() << endl;
}

Класс игрока:

//Declarations
string playerName;
int playerChips;

Player::Player()
{
    //Default constructor for when player is created
    playerChips = 3;
    playerName = "DEFAULT_PLAYER_NAME";
}

void Player::setname(string var)
{
    playerName = var;
}

string Player::returnName()
{
    return(playerName);
}

void Player::printName()
{
    cout << playerName << endl;
}

void Player::addChips(int x)
{
    playerChips += x;
}

void Player::removeChips(int x)
{
    playerChips -= x;
}

int Player::returnChips()
{
    return(playerChips);
}

Я заметил, что на каждой итерации в течение первоначального цикла forloop значение playerList [x] всегда одинаково.Например, если totalNumPlayers = 3, playerList [0], playerList [1] и playerList [2] влияют на строку setName.Поэтому, когда я использую cout для PL 1,2 и 3, он всегда печатает

Player1, Player1, Player1, затем Player2, Player2, Player2 и т. Д.

Почему ссылки на каждый индексне уникален для собственного объекта?

1 Ответ

0 голосов
/ 22 октября 2018

Причина проста.Вы определили string playerName; в глобальном пространстве имен (вы не указали полную структуру исходного файла) и, следовательно, всякий раз, когда вы вызываете Player::setname, вы изменяете эту глобальную переменную и, как результат, когда вы вызываете Player::printName() вВаш цикл for, вы только что прочитали эту переменную, которая используется всеми экземплярами Player.Чтобы это исправить, переместите эту переменную в класс Player:

class Player
{
private: 
    string playerName;
public:
    Player();
    void setname(string var);
    string returnName();
    string Player::returnName();
    void printName();
    void addChips(int x);
    void printName();
    // and the rest of your declarations
};
...