我创建了一个包含大量列表的单例对象。主要是一个保存玩家对象的矢量列表。
这允许我在课程之间发送一份球员名单。
但是,当我尝试编辑这些播放器对象中的信息时,例如分数或转弯时,它不允许我这样做。
代码示例和输出:
u.CreateStaticPlayers();
cout << "turns" << d->getPlayers().at(1).getTurns() << endl;
d->getPlayers().at(1).setTurns(3);
cout << "turns" << d->getPlayers().at(1).getTurns() << endl;
cout << "score" << d->getPlayers().at(1).getScore() << endl;
d->getPlayers().at(1).setScore(11);
cout << "score" << d->getPlayers().at(1).getScore() << endl;
输出
turns 100
turns 100 score 501 score 501
预期输出
turns 100 turns 3 score 501 score 11
关于我可能做错的任何建议?
这些只是标准的获取和设置。我相信,获取和设置是正确的。
按要求获取和设置
int & Player::getTurns()
{
return turns;
}
int &Player::getScore()
{
return score;
}
void Player::setScore(int i)
{
score = i;
}
void Player::setTurns(int i)
{
turns = i;
}
球员级别标题
#pragma once
#include <string>
#include <vector>
using namespace std;
class Player
{
private:
int ID;
string name;
//signifies whether this player is human or not (default 0)
bool isHuman = 0;
//this array holds the current turns the AI wants to perform.
//the array is recalculated whenever a new turn takes place IF the AI doesn't get what it expected to hit.
//set calculated pushes one new value onto the array.
//get calulated returns the entire array.
vector<int> calculatedturns;
//a score that starts at 501, and approaches 0 as the GUI progresses.
//The score decreases and the AI calculates a movement path so we need the ability to GET and SET
int score = 501;
//current darts starts at 3 when the round begins, acts like a counter and a trigger, decreases to 0, and then resets back to 3 at the start of a new round.
//the dart number flucuates from 0-3 so we need the ability to GET and SET.
int darts = 3;
//the amount of rounds the GUIs has currently played,
//we need a GET and SET because the GUIs increases, and we need to display them to the user.
int games = 0;
//the amount of rounds the sets has currently played,
//we need a GET and SET because the sets increases, and we need to display them to the user.
int sets = 0;
//the amount of darts the player has currently thrown.
//we need a GET and SET because the throws increases, and we need to display them to the user.
int turns = 100;
//Will determine if the player has actually won the GUI.
//we need to get the current state to determine certain events have taken place, so we need a GET and a SET.
bool has_won = false;
//Will determine if the player has finished the GUI.
//we need to get the current state to determine certain events have taken place, so we need a GET and a SET.
bool has_finished = false;
//the hit accuracy is predefined for a player, and does not change, it requires a GET and SET.
int hit_accuracy = 0;
//hits needs to be incremented and displayed
//we need a GET and SET.
int total_hits = 0;
//misses needs to be incremented and displayed
//we need a GET and SET.
int total_misses = 0;
public:
Player();
/////GETTERS///////
string &getName();
int &getID();
int &getScore();
int &getAccuracy();
int &getDarts();
int &getGames();
int &getSets();
int &getTurns();
bool &getWon();
bool &getFinished();
int &getHits();
int &getMisses();
vector<int> &getCalculated();
/////SETTERS//////
void setName(string s);
void setID(int i);
void setScore(int i);
void setAccuracy(int i);
void setDarts(int i);
void setGames(int i);
void setSets(int i);
void setTurns(int i);
void setWon(bool i);
void setFinished(bool i);
void setHits(int i);
void setMisses(int i);
void setCalculated(int i);
////CONSTRUCTORS////
Player(int ID, string name, int Accuracy);
////METHODS///
//at the start of the game, score is 501.
//AI must find a way to get score to 60.
int Player::AI_CALCULATE_TURN(int currentscore);
PLAYER CPP
#include "Player.h"
//player class is needed because there is more than one player that requires the same information.
//player class holds crucial data about the player, including their current darts, current score, current GUIplan and other things.
Player::Player()
{
}
////GETTERS/////
string & Player::getName()
{
return name;
}
int & Player::getID()
{
return ID;
}
int &Player::getScore()
{
return score;
}
int &Player::getAccuracy()
{
return hit_accuracy;
}
int &Player::getDarts()
{
return darts;
}
int & Player::getGames()
{
return games;
}
int & Player::getSets()
{
return sets;
}
int & Player::getTurns()
{
return turns;
}
bool & Player::getWon()
{
return has_won;
}
bool & Player::getFinished()
{
return has_finished;
}
int & Player::getHits()
{
return total_hits;
}
int & Player::getMisses()
{
return total_misses;
}
vector<int>& Player::getCalculated()
{
return calculatedturns;
}
////SETTERS/////
void Player::setName(string s)
{
name = s;
}
void Player::setID(int i)
{
ID = i;
}
void Player::setScore(int i)
{
score = i;
}
void Player::setAccuracy(int i)
{
hit_accuracy = i;
}
void Player::setDarts(int i)
{
darts = i;
}
void Player::setGames(int i)
{
games = i;
}
void Player::setSets(int i)
{
sets = i;
}
void Player::setTurns(int i)
{
turns = i;
}
void Player::setWon(bool i)
{
has_won = i;
}
void Player::setFinished(bool i)
{
has_finished = i;
}
void Player::setHits(int i)
{
total_hits = i;
}
void Player::setMisses(int i)
{
total_misses = i;
}
void Player::setCalculated(int i)
{
calculatedturns.push_back(i);
}
Player::Player(int id, string Name, int accuracy)
{
name= Name;
ID = id;
hit_accuracy = accuracy;
}
////METHODS
int Player::AI_CALCULATE_TURN(int currentscore)
{
//score is 501, but it could be anything.
//if score is above 60, the AI should be picking a number from the board arrays, it should aim for the higher number possible.
if (currentscore > 60)
{
}
return 0;
}
** LIST CLASS CPP **
#include "List.h"
//initilizaing the instance.
List* List::theList = NULL;
List * List::getInstance()
{
//will create a new instance if it currently doesn't exist.
if (theList == NULL)
{
theList = new List();
}
return theList;
}
void List::destroyInstance()
{
//deleting the instance
delete theList;
//set the value to null, program won't crash when destructor is called again.
theList = NULL;
}
int List::getExample()
{
return exampleint;
}
vector<Player>List::getPlayers()
{
return PLAYERS_LIST;
}
vector<Player> List::getFinished()
{
return FINISHED_LIST;
}
void List::addPlayer(Player player)
{
PLAYERS_LIST.push_back(player);
}
void List::addFinished(Player player)
{
}
void List::setExample(int i)
{
exampleint = i;
}
List::List()
{
}
List::~List()
{
}
LIST CLASS HEADER
#pragma once
#include <iostream>
#include <vector>
#include "Player.h"
using namespace std;
//my attempt at a singleton object.
class List
{
public:
//this will create the SINGLE instance
//need to be static because we want to call them if the object doesn't exist
static List* getInstance();
static void destroyInstance();
////getters///
vector<Player> getPlayers();
vector<Player> getFinished();
int getExample();
//basically a setter, pushes a player onto the back of the players list. (to signifiy they're playing)
void addPlayer(Player players);
//basically a setter, pushes a player onto the back of the finished list. (to signify they're finished)
void addFinished(Player player);
void setExample(int i);
private:
//shouldn't be able to call these, prevents the creation of a new instance.
List();
~List();
//the instance itself.
static List* theList;
//players list holds all of the players currently in the game.
vector<Player> PLAYERS_LIST;
//finished list holds the players that have finished the game.
vector<Player> FINISHED_LIST;
int exampleint = 0;
};
答案 0 :(得分:1)
你的得主是错的:
vector<Player> List::getPlayers();
以下列方式使用时:
d->getPlayers().at(1).setTurns(3);
您实际上正在影响副本。您不会修改对象中的实际玩家。
让它返回参考:
vector<Player> & List::getPlayers();
// here ^