我在基于文本的 RPG 游戏中工作,但是当我将值设置为 X 变量时,当我再次访问该属性时,它处于默认值,我做错了什么吗?
class Game
{
private:
bool podeAndar;
bool estaBatalhando;
Jogador _jogador;
Mapa _mapa;
public:
Game() { }
Game(Jogador _j){
_jogador = Jogador(_j.getNome());
_mapa.LoadMapa();
podeAndar = true;
estaBatalhando = false;
}
~Game(void)
{
}
Jogador getJogador() {
return _jogador;
}
void setJogador(Jogador v) {
_jogador = v;
}
}
我的“玩家”类
#pragma once
#include "Criatura.h"
#include <string>
class Jogador :
public Criatura
{
private:
int _cap;
public:
Jogador(std::string nome)
{
setNome(nome);
setCap(150);
}
Jogador() { }
~Jogador(void)
{
}
int getCap(){
return _cap;
}
void setCap(int v){
_cap = v;
}
}
它们是我的“主要” - 当我设置值时,当我在调试器中跟踪它时,它正确地设置了值,但是当我再次访问 game.getJogador().getCap() 时,它有默认值 150。
int _tmain(int argc, _TCHAR* argv[])
{
Jogador _player = Jogador("Kyore");
Game game = Game(_player);
while(true){
std::cout << game.getJogador().getCap(); //print 150
game.getJogador().setCap(100); //set cap to 100
std::cout << game.getJogador().getCap(); //print 150 again
break;
}
}
最佳答案
在Game
类,改变这个
Jogador getJogador() {
return _jogador;
}
到
Jogador& getJogador() {
return _jogador;
}
再添加一个方法只读:
const Jogador& getJogador()const {
return _jogador;
}
更新评论中提出的问题
- 将您的剩余值(value)问题解决为
150
尽管设置了新值,但将返回类型转换为reference
足够。
为什么要返回引用作品? 因为,无论何时你的原始版本getJogador()
被调用,对象的拷贝是 创建。即使你正在改变它的值(value),你实际上是 更改创建的临时对象的值,而不是原始对象 一。
因此,由于您的意图是修改原始对象,因此我们需要 访问原始文件,而不是其临时拷贝。Reference
是 在这种情况下更好的机制(pointer
是另一种机制,但不如reference
安全) 现在谈谈为什么我建议重新加载
const member
函数,返回const reference
:这是为了向您强调,仍然可以在不无意中更改其内部状态的情况下获取对象。
您的示例代码没有区分这两个getJogador()
功能。
所以要理解,将这两个函数添加到你的Game class
:void DontManipulate()const { std::cout<<getJogador().getCap(); }
void Manipulate() { std::cout<<getJogador().getCap(); }
查看您得到的编译器错误:- 它应该阐明差异。
此外,如果您std::cout
getJogador()
中的一些消息功能,您应该能够找出差异。
关于c++ - 不持有值的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581109/