【问题标题】:Is it bad to have functions return strings instead of ints? (C++)让函数返回字符串而不是整数是不是很糟糕? (C++)
【发布时间】:2013-04-13 14:43:18
【问题描述】:

我对编程还是比较陌生。我正在使用 SDL 开发一款游戏,我发现自己想知道我在哪里使用了坏习惯。

例如,我有一个名为 titleScreen() 的函数,用户可以在其中决定进入哪种游戏模式。

我可以返回一个 0-3 的值,然后通过 if/else/else/else 语句对其进行处理,以决定他们选择的模式。

我可以返回一个字符串,例如“STORYMODE”、“FREEPLAY”、“TUTORIAL”或“QUIT”,并使用它来决定哪种模式。

我喜欢第二种模式,因为它消除了在试图弄清楚选择了哪种模式时的最初困惑,但我有一种感觉,这样做会有问题。

在我的情况下,返回值的最佳方式是什么?

【问题讨论】:

    标签: c++ string function int return


    【解决方案1】:

    在这种情况下,您应该使用enum 列出所有状态以在不影响性能的情况下实现可读性。 例如:

    enum  mode {
        STORYMODE,
        FREEPLAY,
        TUTORIAL,
        QUIT
    }
    

    【讨论】:

    • 这不仅仅是对性能的影响——它还(至少在外观上)为您的一组可能值提供了一个类型。在 C++11 中,它实际上是强类型的。
    【解决方案2】:

    您应该为此使用枚举,这实际上是 int 但更具可读性。 所以我会创建:

    enum GameMode { STORYMODE, FREEPLAY, TUTORIAL, QUIT };
    

    并且有方法返回类型 GameMode。

    编辑 2:

    如果每个游戏模式都有按钮,则只需在单击按钮时返回枚举或使用枚举参数调用其他方法。与您现在使用字符串的方式相同。

    【讨论】:

    • 那么我应该把枚举的声明放在哪里呢?在 main 函数被调用之前?还是那个枚举被认为是它自己的函数?
    • 啊,我没听懂你的问题。所以你有这些值作为控制台的输入?
    • 感谢您的回复,感谢您对我的包容。我正在做一个 SDL 应用程序,所以我有 main.cpp、function.h 和 function.cpp 作为我的文件。我的主函数调用init()、loadFiles(),然后应该调用titlescreen()。 Titlescreen() 应该返回枚举值,但我不确定是否要在 main、titlescreen() 函数中编写该枚举行,或者在 function.h 和 function.cpp 文件中编写它自己的行.很抱歉,我对这一切都很陌生,当我在书本上学习时,我忍不住尝试解决我没有准备好的目标。
    • 我编辑了我的答案,所以你可以看看是否能解决你的问题。
    • 对不起,我忘了说它不是控制台。用户实际上有一个带有图像和按钮的 800x600 应用程序窗口。用户用鼠标点击一个按钮(这部分有效),点击应该返回游戏模式值。
    【解决方案3】:

    如果返回一个指向游戏对象的共享指针呢?下面是一些让您入门的伪代码,无论调用 titleScreen 都应该在返回的对象上调用 operator()

    class GameI {
    public:
        virtual ~GameI() {};
        void operator() = 0;
    }
    
    typedef std::shared_ptr<GameI> SharedGame;
    
    class GameStory {
    public:
        void operator();
    }
    
    void GameStory::operator()
    {
        ...
    }
    
    SharedGame titleScreen()
    {
        ...
        return SharedGame(new GameStory());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多