【问题标题】:Set functions won't work for some reason设置函数由于某种原因不起作用
【发布时间】:2014-06-29 20:05:08
【问题描述】:

我正在开发一个简单的控制台应用程序,以制作一种计算两个大型中世纪士兵单位之间战斗的方法的原型。我的想法是我将设置计算,并使用不同的参数运行程序几次,以了解它是否是我想要的。无论如何,解决问题。

这两个单元中的每一个都由一个 Unit 类表示。该类包括“攻击”、“防御”、“战术”和“单位大小”的变量以及其他一些我正在注释掉并忽略的变量,直到我解决了这个问题。这是类头的代码:

#ifndef UNITS_H
#define UNITS_H
#include <string>
#include <iostream>

class Unit
{
  public:
      int attack;
      int defense;
      int charge;
      int brace;
      int tactics;
      int unit_size;

  public:
      bool isAlive;
      std::string name;
      Unit(std::string name_target)
      {
          name = name_target;
          attack = 1;
          defense = 1;
          charge = 1;
          brace = 1;
          tactics = 1;
          unit_size = 1;
          isAlive = true;
      }

      float GetAttack() {return (float)attack;}
      float GetDefense() {return (float)defense;}
      float GetCharge() {return (float)charge;}
      float GetBrace() {return (float)brace;}
      float GetTactics() {return (float)tactics;}
      float GetSize() {return (float)unit_size;}

      void SetAttack(int change) {attack = change;}
      void SetDefense(int change) {defense = change;}
      void SetCharge(int change) {charge = change;}
      void SetBrace(int change) {brace = change;}
      void SetTactics(int change) {tactics = change;}
      void SetSize (int change) {unit_size = change;}

      void TakeCasualties (int casualties);
      int Defend(Unit enemy, float base_chance, float base_multiplier);
      void DisplayStats();

    };

#endif // UNITS_H

对不起,如果草率,但我有点业余。

我会包含该类的 .cpp 代码,但其中的所有内容都可以正常工作。我已经用默认值完成了测试运行,没有任何问题。我唯一的问题是在构造它们之后更改值。

在 main.cpp 中,我有一个函数 AssignStats(Unit unit_target),一旦构造了两个单元,我就会调用它。我依次调用每一个。代码如下:

void AssignStats (Unit unit_target)
{
    int x;
    cout << unit_target.name << endl;
    cout << "Value for attack?" << endl;
    cin >> x;
    cout << x << endl;
    unit_target.SetAttack(x);

    cout << "Value for defense?" << endl;
    cin >> x;
    unit_target.SetDefense(x);

    //unit_target.SetCharge(x);
    //unit_target.SetBrace(x);

    cout << "Value for tactics?" << endl;
    cin >> x;
    unit_target.SetTactics(x);

    cout << "Value for size?" << endl;
    cin >> x;
    unit_target.SetSize(x);
}

据我所知,这段代码应该可以工作。但是,当我之后显示每个 Unit 的统计信息时,它会显示构造函数输入的默认值。对于我的生活,我无法弄清楚为什么我的 Set 功能不起作用。我早些时候重写了代码以检查它们是否输入正确,如下所示:

void Unit::SetAttack()
{
    int x;
    std::cout << "Input target value for attack." << std::endl;
    std::cin >> x;
    std::cout << x;
    attack = x;
    std::cout << attack;
}

我会输入 10,然后每个 couts 会立即显示 10,即使是应该显示该类的攻击变量的那个,但后来当我调用 DisplayStats() 时,它会显示所有内容再次使用默认值。

比我更有经验的人可以解决这个问题吗?

【问题讨论】:

  • 我相信您可以缩小范围。例如,你的类有 六个 属性,每个属性都有 getter 和 setter,但你不能只用 一个 重现问题吗?分而治之应该是您调试的第一步,而不是最后一步(或者留给我们去做)。
  • 祝这个有趣且雄心勃勃的项目好运。有几个人指出了为什么你的代码不起作用,但也许当你在那里时,你应该问自己为什么你的成员变量存储为整数,设置为整数......但是当你得到它们时转换为浮点数?
  • 选角的原因是我首先通过计算一个单位的任何一名士兵杀死另一个单位的任何一名士兵的百分比来确定战斗的结果。然后我为一个单位的每个士兵掷一次,以确定有多少来自另一个单位的士兵被杀。确定机会的等式涉及一些除法,因此我使用浮点数来确保除法保持精确。我将变量保留为整数,因为我想确保它们保持整数。

标签: c++ class variable-assignment member-variables


【解决方案1】:

我认为问题在于函数AssignStats 按值接受参数

void AssignStats (Unit unit_target);

该函数处理原始对象的副本。原始对象本身没有改变。

按以下方式更改

void AssignStats (Unit &unit_target);

【讨论】:

  • 谢谢!我现在觉得很傻,没想到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2012-01-28
相关资源
最近更新 更多