【问题标题】:C++ call function from class without instantiating it [duplicate]C ++从类调用函数而不实例化它[重复]
【发布时间】: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


【解决方案1】:

好的,我只需要将 dice. 更改为 dice::。我觉得很傻。我不太了解其中的区别,但我会研究一下。

另外,由于开销无关紧要,并且使用不同的路径来完成相同的事情是不好的做法(最重要的是它仍然可以全部在一行上),我刚刚删除了静态函数,而是使用

dice(int).roll();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2023-01-07
    • 2014-11-28
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多