我有一个函数,用于计算对物体造成的损坏
string Weapon::attack(int Damage, int ExtraDamage, string Type)
{
srand(time(NULL));
int totalDamage = 0;
int percentileDie = rand() % 100 + 1;
if (percentileDie <= ChanceToHit) {
for (int i = 0; i <= Damage; i++)
{
int sixSidedDie = rand() % 6 + 1;
totalDamage = totalDamage + sixSidedDie;
}
totalDamage = totalDamage + ExtraDamage;
}
else {
totalDamage = 0;
}
Result = totalDamage;
if (Type == "Crossbow") {
return "Twang! ";
}
else if (Type == "Dagger" || Type == "Sword") {
return "Swing! ";
}
}
但是,当我在程序中调用变量Result
时,我得到的数字-858993460
。我将Result = totalDamage
更改为Result = 6
,看看它是否会返回6
但它再次返回-858993460
。
谁能帮我?
如果我这样做:
Weapon t;
t.attack(2, 4, "Sword");
cout << t.attack(2, 4, "Sword") << t.Result << endl;
我得到了正确的数字,但是如果我这样做:
Weapon t;
cout << t.attack(2, 4, "Sword") << t.Result << endl;
我又-858993460
得到号码!
此外,结果在类中声明:
class Weapon {
public:
string Name;
int Damage, ExtraDamage, Result;
float ChanceToHit;
string attack(int,int,string);
};
cout << X << Y
的评估顺序不是为X
和Y
排序的。
所以这段代码:
Weapon t;
cout << t.attack(2, 4, "Sword") << t.Result << endl;
将首先评估t.attack()
或t.Result
- 根据您的帖子,似乎首先评估t.Result
。
解决方案是强制编译器以正确的顺序执行操作,例如
Weapon t;
std::string str = t.attack(2, 4, "Sword");
cout << str << t.Result << endl;
如果您查看此处到底发生了什么,那么您将意识到运算符"<<"用于将数据添加到输出流。"<<"运算符被定义为在流中添加数据并返回修改后的流的引用以供进一步使用,这就是我们可以在单个"cout"中使用多个"<<"的原因,因此将值放在流中的顺序与您读取它的顺序相反。
所以它就像
cout<<firstOperand<<secondOperand<<thirdOperand;
被评估为
cout(<<firstOperand(<<secondOperand(<<thirdOperand)));
这反过来意味着首先将"第三操作数"添加到输出流中,然后返回更新的流。现在,"secondOperand"以类似的方式被推送到同一个返回的流,然后将"firstOperand"推送到输出流。现在,所有"<<"运算符都已完成。现在 cout 将流内容放在输出文件中。
因此,在您的情况下,由于 t.Result 在类函数中计算之前被添加到输出流中,因此您获得的值是在对象构造期间初始化的 Result 的随机值。