【问题标题】:C++ enum error when trying to read enum state尝试读取枚举状态时出现 C++ 枚举错误
【发布时间】:2023-03-27 15:47:01
【问题描述】:

我正在用 C++ 制作游戏,但我遇到了枚举问题。我正在定义一个枚举:

enum class CharacterClass {
    warrior = 0,
    scout = 1,
    mage = 2
};

我在 Player 类中使用它:

class Player
{
    public:
        Player();
        ~Player();

        CharacterClass PlayerClass;

    private:
};

当我试图设置枚举的状态时:

Player player();
player.PlayerClass = CharacterClass::mage;

编译器发现这个错误:

request for member 'PlayerClass' in 'player', which is of non-class type 'Player()'

【问题讨论】:

  • 如何创建player 实例? Player player(); ?
  • 我觉得最麻烦的解析
  • 那么我们在这里,Player player(); 声明了一个函数。你应该改写Player player;
  • 它工作正常,谢谢!

标签: c++ class enums


【解决方案1】:

那最多vexing parseplayer被理解为函数声明。所以 player.PlayerClass 会触发这个错误。

试试:

Player player{};  // prefer uniform brace-initialisation 

这篇关于variable initialization 的博客文章很好地解释了每种形式的优缺点。

【讨论】:

  • 不是最令人头疼的解析。 MVP 声明了一个函数,该函数返回一个对象并接受一个未命名的函数类型参数。
  • 为什么是Player player{}; 而不仅仅是Player player;..?我想知道两者之间的区别。
  • 我输入了Player player;,它工作正常,我认为这甚至比Player player{}; 更好
  • @WhozCraig 大多数说明 MVp 的示例确实如您所说。然而,它的模棱两可。Scott Meyers 发明了这个术语,他自己将这种精确情况称为 MVP(在“Effective Modern C++”,第 51 页底部)
  • @Christophe 也许是这样,我不拥有这本书。但是正式标准没有提到我可以找到的 8.2 [dcl.ambig.res] 中的简单函数 decl,它特别指出了我引用的案例和 wiki 提到的案例。 6.8 [stmt.ambig] 也不涵盖 OP 的情况。他(和其他所有人)可以随心所欲地称呼它,但我更喜欢这样称呼它:错误输入的函数声明。
【解决方案2】:

Player player() 不会创建 Player 类型的变量!相反,它声明了一个函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多