gpt4 book ai didi

C++ 对象不保存值

转载 作者:行者123 更新时间:2023-11-28 02:12:04 26 4
gpt4 key购买 nike

我为 Player 类创建的对象不会更改私有(private)变量,即使它在更改它的函数中也会更改。 main() 函数中使用的对象可能存在一些引用问题,但我无法弄清楚在哪里或为什么。

特别是主文件末尾的循环打印了 vector Players 中玩家赢得的游戏,但所有分数都返回 0。而当玩家 object.matchWon() 函数正确解析和打印分数并显示对私有(private)变量所做的更改。

我怀疑主代码中getPlayer()函数的使用有问题。

提前致谢!

Player.cpp:

#include "Player.h"
#include <stdlib.h>
#include <iostream>

using namespace std;
//constructor
Player::Player(string first, string last) {
Player::first = first;
Player::last = last;
gWins = 0;
gLoss = 0;
mWins = 10;
mLoss = 2;
}

//setters
void Player::addLoss(int increment) {
this->gLoss+=increment;
}

void Player::addWins(int increment) {
this->gWins+=increment;
}

void Player::matchWon(vector<string> scores) {
for (int i = 5;i<scores.size()-1;i++){
cout<<(int)scores[i][0]-'0'<<"-";
cout<<(int)scores[i][2]-'0'<<endl;
gWins+=scores[i][0]-'0'; //add games won
cout<<gWins<<endl;
gLoss+=(int)scores[i][2]-'0'; //add games lost
}
this->mWins++;
}

void Player::matchLost(vector<string> scores) {
this->mLoss++;
}

double Player::winPercentage() {
return (double)mWins / mLoss;
}

//accessors
string Player::getFirstname() {
return this->first;
}

string Player::getLastname() {
return this->last;
}

int Player::getGameswon() {
//cout<<gWins;
return this->gWins;
}

main.cpp:

#include <iostream>
#include "player.h"
#include <fstream>
#include <vector>
#include <sstream>

using namespace std;

vector<string> split(const string &s) {
vector<string> elems;
istringstream iss(s);
do
{
string sub;
iss >> sub;
elems.push_back(sub);

//cout << "Substring: " << sub << endl;

} while (iss);

return elems;
}

Player &getPlayer(vector<Player> &players, const string &first, const string &last){
for (int i=0;i<players.size();i++){
if (players[i].getFirstname()==first&&players[i].getLastname()==last){
return players[i];
}
}
players.push_back(Player(first,last));
return (players[players.size()-1]);
}

int main(int argc, char *argv[]) {

ifstream file(argv[1]);
ofstream ofile(argv[2]);
if (!file.is_open()){
cerr <<"Could not open file\n";
return 0;
}

string line;
vector<Player> players;

while (getline(file,line).good()){

vector<string> lineParsed = split(line);
vector<string> matchData = split(line);

Player p1 = getPlayer(players,lineParsed[0],lineParsed[1]);
Player p2 = getPlayer(players,lineParsed[3],lineParsed[4]);

p1.matchWon(lineParsed);
cout<<p1.getFirstname()<<"!"<<p1.getGameswon()<<endl;
}

for (int i=0;i<players.size();i++){
//cout<<players.size();
cout<<players[i].getFirstname()<<":"<<players[i].getGameswon()<<endl;
}


return 0;
}

最佳答案

您正在复制您的玩家:

Player p1 = getPlayer(players,lineParsed[0],lineParsed[1]);
Player p2 = getPlayer(players,lineParsed[3],lineParsed[4]);

所以当您 p1.matchWon() 时,它发生在本地 Player 对象上,而不是 vector 中的对象。

虽然 getplayer() 的返回类型是 Player&,但如果您将它分配给非引用变量,那也没关系。如果你想修改 vector 中的 Player 实例,你应该有

Player& p1 = getPlayer(players,lineParsed[0],lineParsed[1]);
Player& p2 = getPlayer(players,lineParsed[3],lineParsed[4]);

顺便说一下,getPlayer() 是不安全的。当您 push_back 时, vector 可能会自行调整大小,从而使引用无效。您可能想要存储一个指针 vector (或者只是通过例如 resize() 确保该 vector 确实有空间容纳您想要推送给它的所有玩家)。

关于C++ 对象不保存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35284382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com