【发布时间】:2022-01-08 08:03:01
【问题描述】:
在dice.h,我有
class dice {
public:
dice(int sides);
int roll() const;
static int globalRoll(int sides);
private:
int sides;
在dice.cpp
dice::dice(int sides) {
this->sides = sides;
}
int dice::roll() const {
return rand() % sides + 1;
//Here sides refers to member field
}
int dice::globalRoll(int sides) {
return rand() % sides + 1;
//Here sides refers to parameter
}
然后,例如在函数rollInitiative() 中,我有调用
return dice.globalRoll(20) + getDexMod();
这不起作用,因为“类型名称 [dice] 是不允许的”。我可以执行以下操作,但我不想为单个点名创建实例。
dice d(20);
return d.roll() + getDexMod();
我的假设是我可以在不实例化类的情况下调用静态函数,因为我的理解是静态函数不引用类的实例。
【问题讨论】:
-
dice.->dice:: -
你的猜测差不多了:
return dice::globalRoll(20) + getDexMod(); -
“我宁愿不为一个点名创建一个实例。” 为什么?您不喜欢代码的外观吗?你认为它会更慢吗?你知道它仍然可以是单线吗?
dice(20).roll() -
@DrewDormann 虽然我对内存管理不太熟悉,但我觉得实例化不需要的东西是无效的。我还认为它的速度慢得可以忽略不计。但是当我们开始着手时,我只是不喜欢有两条线,因为我觉得我可以在一条线中完成。
-
因此,一旦你完成了这项工作,你就有两种不同的方式来生成骰子的滚动:你可以创建一个有边数的对象并调用它的
roll成员函数,或者您可以调用roll(int)函数并将边数传递给它。您可能应该选择其中一个。以两种方式做同一件事会导致混乱,特别是如果您决定需要改变做事的方式,并且必须在两个不同的地方进行相同的改变。
标签: c++ static-methods