C++为什么我不能在结构中进行算术运算或转换?

Log*_*ing -1 c++ struct casting

我有一个游戏,我想计算一个玩摇滚纸剪刀的玩家对计算机的输赢(C++的随机数函数).为了跟踪玩家的胜利,损失以及与计算机的关系,我创建了这个结构(这是全局的):

struct human{
    short wins = 0;
    short losses = 0;
    short ties = 0;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试使用short结构中的一个变量进行数学运算时会出现问题:

int main(){
    short totalPlays = 1;
    float winsPerc;
    outcome(totalPlays, winsPerc);
}
void outcome(short totalPlays, float& winsPerc){
    winsPerc = (static_cast<float>(human.wins) / static_cast<float>(totalPlays))* 100;
}
Run Code Online (Sandbox Code Playgroud)

在这两个函数中,我试图计算玩家获胜的百分比.但是,我的编译器似乎humanhuman.wins变量的一部分解释为一个类型.所以当然我试图改变human.winsshort human.wins无济于事.之后,编译器只表示类型short是意外的.由于这是如此模糊,我真的不知道我做错了什么.任何帮助将非常感谢!

Lig*_*ica 6

你误解了struct是什么.您将自己struct human视为一个对象,您可以使用可以执行操作的数据,但事实并非如此; 这是一种类型,就像一个类.事实上,它一个阶级.

short在其成员的话语之前随机添加关键字不会完成任何事情!(你的"当然"条款是荒谬的,我很害怕.)

您必须先实例化该类型,然后才能使用它.在你的情况下,有一个简单的速记:

struct {
    short wins = 0;
    short losses = 0;
    short ties = 0;
} human;
Run Code Online (Sandbox Code Playgroud)

现在这是一个未命名的struct类型定义,立即实例化为human.

可能导致您混淆的一点是使用另一种简写:那些内联成员初始化者(在少数几年中只有有效的语法).他们说,只要这种类型的对象被实例化,它的所有成员都将被初始化为0.如果您的代码看起来像这样可能更明显:

struct human_t {
    short wins;
    short losses;
    short ties;
};

human_t human = {0, 0, 0};
Run Code Online (Sandbox Code Playgroud)

虽然前面的例子可能很好,只要你的观众理解现代C++.