Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 让函数返回字符串而不是int是否不好?(C+;+;)_C++_String_Function_Int_Return - Fatal编程技术网

C++ 让函数返回字符串而不是int是否不好?(C+;+;)

C++ 让函数返回字符串而不是int是否不好?(C+;+;),c++,string,function,int,return,C++,String,Function,Int,Return,我对编程还是比较陌生的。我正在用SDL做一个游戏,我发现自己在想我在哪里使用了坏习惯 例如,我有一个名为titleScreen()的函数,其中用户决定进入游戏的哪种模式 我可以从0-3返回一个值,然后通过if/else/else/else语句处理该值,以确定他们选择的模式 或 我可以返回一个字符串,比如“STORYMODE”、“FREEPLAY”、“TUTORIAL”或“QUIT”,并用它来决定哪种模式 我喜欢第二种模式,因为它消除了试图找出选择了哪种模式时的最初困惑,但我有一种感觉,我觉得这样

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

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

我可以从0-3返回一个值,然后通过if/else/else/else语句处理该值,以确定他们选择的模式

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

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


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

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

enum  mode {
    STORYMODE,
    FREEPLAY,
    TUTORIAL,
    QUIT
}

您应该为此使用枚举,它实际上是int,但更具可读性。 因此,我将创建:

enum GameMode { STORYMODE, FREEPLAY, TUTORIAL, QUIT };
并具有方法返回类型GameMode

编辑2:


若每个游戏模式都有按钮,只需在单击按钮时返回enum或调用带有enum参数的其他方法即可。与现在使用字符串的方式相同。

返回游戏对象的共享指针如何?下面是一些伪代码,可以让您开始使用,任何调用
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());
}
class GameI{
公众:
虚拟~GameI(){};
void运算符()=0;
}
typedef std::shared_ptr SharedGame;
班级游戏故事{
公众:
void运算符();
}
void GameStory::operator()
{
...
}
SharedName标题屏幕()
{
...
返回SharedName(新游戏故事());
}

这不仅仅是性能上的成功——它还(至少在装饰上)为您的一组可能值提供了一种类型。在C++11中,它实际上是强类型的。那么,我应该把枚举的声明放在哪里呢?在调用函数之前是否在main中?或者那个枚举被认为是它自己的函数吗?啊,我对你的问题还不太了解。所以你们在控制台中输入了这些值?谢谢你们的回复,也谢谢你们的支持。我正在做一个SDL应用程序,所以我有main.cpp、function.h和function.cpp作为我的文件。我的主函数调用init()、loadFiles(),然后应该调用titlescreen()。Titlescreen()应返回枚举值,但我不确定是否要在main、Titlescreen()函数中或在function.h和function.cpp文件中写入该枚举行。我很抱歉,我对所有这些都很陌生,当我在通过书本学习的时候,我忍不住要尝试去实现我没有准备好的目标。我编辑了我的答案,所以你可以看看这是否解决了你的问题。对不起,我忘了提到它不是控制台。用户实际上有一个800x600应用程序窗口,其中包含图像和按钮。用户用鼠标点击一个按钮(这部分有效),点击应该返回gamemode值。