【问题标题】:How to access struct and enum members form a class?如何访问结构和枚举成员形成一个类?
【发布时间】:2017-12-29 16:37:00
【问题描述】:

这似乎是一个简单的解决方案,但对我来说已经有一段时间了。我说的是这段代码:

class MainWindow
{
    public:

        enum class Difficulty
        {
            Beginner,
            Intermediate,
            Advanced
        };

        struct DifficultyLevelsProperties
        {
            struct BeginnerProperties
            {
                const int PADDING_HEIGHT = 9;
                const int PADDING_WIDTH = 9;
                const int MINES = 10;
            };

            struct IntermediateProperties
            {
                const int PADDING_HEIGHT = 16;
                const int PADDING_WIDTH = 16;
                const int MINES = 40;
            };

            struct AdvancedProperties
            {
                const int PADDING_HEIGHT = 16;
                const int PADDING_WIDTH = 40;
                const int MINES = 99;
            };
        };

        MainWindow();
        ~MainWindow();

    private:

        Difficulty difficulty = Difficulty::Beginner;
        int mines = DifficultyLevelsProperties::BeginnerProperties.MINES;
        int paddingHeight =  DifficultyLevelsProperties::BeginnerProperties.PADDING_HEIGHT;
        int paddingWidth = DifficultyLevelsProperties::BeginnerPropertiesPADDING_WIDTH;

我想要实现的目标非常明显。我尝试了许多使用“。”的组合。和 "::" 运算符在不同的地方或使它们成为静态的,但我仍然无法正确处理。我要么得到“'Difficulty' 不是类或命名空间”错误,要么得到“'.'之前的预期主表达式。”令牌”。请帮忙。谢谢!

【问题讨论】:

  • 请发布导致错误的代码,以及项目中的位置以及包含它的文件。您是否正确使用了头文件?您确定不需要前向声明吗?您的嵌套类型是公共的,这是一种代码气味;您确定要使用嵌套类型而不是顶级类型吗?
  • 我认为您应该为 DifficultyLevelsProperties 使用实例数组,而不是单独的 struct 定义,因为它们具有相同的结构。
  • 您的课程缺少结束语 };。这不是您遇到问题的代码。贴出真实代码。
  • 非常感谢您的所有建议,顺便说一句非常有帮助,但我正在寻找解决问题的方法!我不知道你的第二条评论@Dai 是什么意思,你能用一个例子来解释或演示吗?

标签: c++ struct enums


【解决方案1】:

我正在查看您的代码的问题是您正在尝试访问未实例化的值。我的意思是,当您尝试为 mines 属性分配值时,您引用的是声明,而不是实例化的值,因为没有实例化。

当您声明某些内容时,您是在解释如何在不分配任何值或行为的情况下构造内存。

枚举正在工作,因为符号名称被映射到一个值(过去它直接映射到一个 int 类型),所以当您引用符号值时,您不会收到错误。这与minespaddingHeightpaddingWidth 不同。下面的代码对我有用:

class MainWindow
{
    public:

        enum class Difficulty
        {
            Beginner,
            Intermediate,
            Advanced
        };

        struct DifficultyLevelsProperties
        {
            struct BeginnerProperties
            {
                const int PADDING_HEIGHT = 9;
                const int PADDING_WIDTH = 9;
                const int MINES = 10;
            } beginner;

            struct IntermediateProperties
            {
                const int PADDING_HEIGHT = 16;
                const int PADDING_WIDTH = 16;
                const int MINES = 40;
            } intermediate;

            struct AdvancedProperties
            {
                const int PADDING_HEIGHT = 16;
                const int PADDING_WIDTH = 40;
                const int MINES = 99;
            } advanced;
        } levelProperties;

        MainWindow();
        ~MainWindow();

    private:

        Difficulty difficulty = Difficulty::Beginner;
        int mines = levelProperties.beginner.MINES;
        int paddingHeight = levelProperties.beginner.PADDING_HEIGHT;
        int paddingWidth = levelProperties.beginner.PADDING_WIDTH;
};

顺便说一句,从 SOLID 原则的角度来看,设计可能不是最好的。您正在使用 MainWindow 混合处理属性。也许从 MainWindow 中提取该功能更好。

为您的扫雷游戏编写愉快的代码 ;)

【讨论】:

  • 哇,这很有帮助!非常感谢你!好吧,这是一个愚蠢的错误。无论如何,你能解释一下你的最后两句话吗?不知道我是否理解正确。
  • 嗯...我仍然收到“'难度'不是类或命名空间”错误...想法?
  • 我必须使用修饰符--std=c++11进行编译,也许你必须指定它。
  • 这是关于 SOLID 原则的。 en.wikipedia.org/wiki/SOLID_(object-oriented_design) 也许这个其他链接更具说教性:scotch.io/bar-talk/…
  • 是的,我忘记了 -std=c++11 标志,就是这样。非常感谢您的链接!并寻求解决方案!
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多