我正在研究一个简单的控制台应用程序,以计算两个大型中世纪士兵之间的战斗计算方法。我的想法是设置计算,并使用不同的参数多次运行程序以感受它,以及它是否是我想要的。无论如何,关于这个问题。
两个单元中的每一个都由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),一旦构造了两个Unit,我就调用它。我依次称它为每一个。代码如下:
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);
}
据我所知,这段代码应该有效。但是,当我之后显示每个单元的统计信息时,它会显示构造函数输入的默认值。对于我的生活,我无法弄清楚为什么我的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()时,它会显示所有内容再次默认值。
有人比我更有经验请清楚这一点吗?
答案 0 :(得分:3)
我认为问题是函数AssignStats
通过值接受参数
void AssignStats (Unit unit_target);
这是函数处理原始对象的副本。原始对象本身不会改变。
按以下方式更改
void AssignStats (Unit &unit_target);
答案 1 :(得分:0)
我测试了你的Set功能,它们工作正常。我认为问题是
void AssignStats(Unit unit_target);
您通过值传递Unit参数,而不是 reference 。这会导致生成Unit对象的本地副本,并使用新参数对其进行初始化。
您需要通过引用调用:
void AssignStats(Unit&amp; unit_target);
这样,就会传递对原始对象的引用,并且你的Set()函数赋值将对它起作用。
问题之外的一些其他建议:
在C ++中,通过引用传递参数通常比传递值更可取,因为由于复制而按值传递大对象的开销可能很大。
如果您使用setter / getter方法设置参数,那么这些参数应该声明为private或protected,而不是public。这是面向对象封装的一个方面 - 不允许在对象外部更改参数。
例如你应该
//or protected if you will subclass Unit later
private:
int attack;
int defense;
int charge;
int brace;
int tactics;
int unit_size;