c++ - 不持有值的类属性

标签 c++ windows-console

我在基于文本的 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;
        }

更新评论中提出的问题

  1. 将您的剩余值(value)问题解决为 150尽管设置了新值,但将返回类型转换为 reference足够。
    为什么要返回引用作品? 因为,无论何时你的原始版本 getJogador()被调用,对象的拷贝是 创建。即使你正在改变它的值(value),你实际上是 更改创建的临时对象的值,而不是原始对象 一。
    因此,由于您的意图是修改原始对象,因此我们需要 访问原始文件,而不是其临时拷贝。 Reference是 在这种情况下更好的机制( pointer 是另一种机制,但不如 reference 安全)
  2. 现在谈谈为什么我建议重新加载 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/

相关文章:

调度程序运行时 Python 脚本弹出控制台

windows - 终端中的 Ctrl+Z 行为

c - 如何从 Code::Blocks 的输出窗口中删除与执行相关的文本

batch-file - 如何在批处理文件中将环境变量设置为带有空格的值?

Python.exe 在新的控制台窗口中打开

C++ 静态数组导致内存泄漏?

C++ 错误。这个指针的概念问题

c++ - Boost Spirit Qi 验证输入解析器

c++ - 用 bool 逻辑替换 IF 语句(随机条件) - 执行时间是否相同?

c++ - bool 内存高效链表