gpt4 book ai didi

c++ - 如何干净地创建类型安全的枚举参数

转载 作者:行者123 更新时间:2023-11-28 05:49:07 25 4
gpt4 key购买 nike

我想创建一个函数“void set_tic_tac_toe_start_player(char c)”。这不是函数的实际名称,但它解释了它的意图。

之所以要在编译时完成,是因为我想创建一个类来封装 TicTacToe 系统,以便系统可以在游戏开始前显式地覆盖开始播放器,而无需重建类。

这是一个简单而复杂的示例代码。

#include <iostream>
#include <cstdlib>

class TTCSystem
{
public:
static const int PLAYERX = 1;
static const int PLAYERO = 2;

void set_tic_tac_toe_start_player(char c);
private:
int start_player;
};

void TTCSystem::set_tic_tac_toe_start_player(char c)
{
if (c == 'x' || c == 'X') {
this->start_player = PLAYERX;
} else if (c == 'o' || c == 'O') {
this->start_player = PLAYERO;
} else {
std::cout << "PANICING AS HARD AS I CAN" << std::endl;
exit(0);
}
}

int main(int argc, char **argv)
{
TTCSystem ttcs;
ttcs.set_tic_tac_toe_start_player('9');

return 0;
}

该函数将用于覆盖进入井字游戏的默认玩家,'X' 或 'O'。

问题是任何字符都可以传递,而只想接受{'x', 'X', 'o', 'O'}。

我可以创建一个枚举,但我担心枚举不会强制执行类型检查。

我可以使用一个类来发明一个枚举类型,或者利用继承,但即使我走那条路,我也不想重新发明轮子并在这方面做得很糟糕。

是否有更通用/优雅/简单的解决方案来创建类型安全的枚举?

我正在寻找可以确保在编译时检查 set_tic_tac_toe_start_player 的输入的东西,以确保选择先走的玩家是有效玩家(4 个输入之一)。

[编辑] 感谢 Jonathan 的建议,我已经在下面发布了解决方案。

最佳答案

谢谢乔纳森。这是我根据您的回复提出的解决方案。

这部分只是为了演示无效参数的拒绝,删除它以查看它是否正确编译。

    ttcs.set_tic_tac_toe_start_player(9);
std::cout << "player: "
<< ttcs.get_tic_tac_toe_start_player()
<< std::endl;

解决方法如下

#include <iostream>

class TTCSystem
{
public:
enum Player {PlayerX, PlayerO};

void set_tic_tac_toe_start_player(Player p);
char get_tic_tac_toe_start_player();

private:
Player start_player;
};

void TTCSystem::set_tic_tac_toe_start_player(Player p)
{
this->start_player = p;
}

char TTCSystem::get_tic_tac_toe_start_player()
{
return ((start_player == PlayerX) ? 'X' : 'O');
}


int main(int argc, char **argv)
{
TTCSystem ttcs;
ttcs.set_tic_tac_toe_start_player(TTCSystem::PlayerX);
std::cout << "player: "
<< ttcs.get_tic_tac_toe_start_player()
<< std::endl;

ttcs.set_tic_tac_toe_start_player(TTCSystem::PlayerO);
std::cout << "player: "
<< ttcs.get_tic_tac_toe_start_player()
<< std::endl;

ttcs.set_tic_tac_toe_start_player(TTCSystem::PlayerX);
std::cout << "player: "
<< ttcs.get_tic_tac_toe_start_player()
<< std::endl;

ttcs.set_tic_tac_toe_start_player(9);
std::cout << "player: "
<< ttcs.get_tic_tac_toe_start_player()
<< std::endl;

return 0;
}

关于c++ - 如何干净地创建类型安全的枚举参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com