如何将字符串赋值给int变量?卡牌程序构造函数牌面映射实现咨询
嘿,你好!看起来你碰到了两个相关的问题:一是没法把字符串直接赋值给int变量,二是不知道怎么在Card构造函数里把数字rank映射成"Ace"、"Jack"这类字符串名称。我来一步步帮你梳理清楚:
1. 为什么不能把字符串赋值给int变量?怎么解决?
首先得明确:int类型是专门用来存储整数数值的,它的内存空间只能容纳数字,根本存不了字符串(比如"Ace"是多个字符组成的序列)。你代码里写的rank = "Ace";肯定会编译报错,因为左右两边的类型完全不兼容——左边是int,右边是字符串常量。
解决思路很简单:给你的Card类新增一个字符串类型的成员变量,用来存储卡牌的显示名称(比如"Ace"、"Jack"),而原来的int类型rank继续保留,用来存储数字形式的rank(1代表Ace,11代表Jack等)。这样做的好处是,既保留了数字rank用于逻辑计算(比如比较卡牌大小、洗牌排序),又能得到友好的字符串名称用于展示。
2. 实现数字Rank到字符串名称的映射
下面是具体的代码实现方案,你可以根据需求选择:
首先先完善Card类的定义:
#include <string> #include <stdexcept> // 用于处理非法rank值的情况 class Card { private: char suit; int rank; // 存储数字形式的rank:1=Ace,2-10=对应数字,11=Jack,12=Queen,13=King std::string rankName; // 存储显示用的字符串名称 public: Card(char suiter, int ranker); // 提供获取rank名称的方法 std::string getRankName() const { return rankName; } // 提供获取数字rank的方法 int getRank() const { return rank; } };
方式一:用switch-case清晰处理每个映射
这种方式逻辑直观,适合需要自定义特殊情况的场景:
Card::Card(char suiter, int ranker) { suit = suiter; // 先校验rank的合法性,避免传入无效值 if (ranker < 1 || ranker > 13) { throw std::invalid_argument("Rank must be between 1 and 13"); } rank = ranker; // 根据数字rank映射到对应的字符串名称 switch(rank) { case 1: rankName = "Ace"; break; case 11: rankName = "Jack"; break; case 12: rankName = "Queen"; break; case 13: rankName = "King"; break; default: // 2-10直接将数字转为字符串 rankName = std::to_string(rank); break; } }
方式二:用数组映射更简洁
如果觉得switch-case太繁琐,可以提前定义一个映射数组,直接通过索引获取对应的名称:
Card::Card(char suiter, int ranker) { suit = suiter; if (ranker < 1 || ranker > 13) { throw std::invalid_argument("Rank must be between 1 and 13"); } rank = ranker; // 定义映射数组,索引0留空,1-13对应卡牌的字符串名称 const std::string rankMap[] = {"", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"}; rankName = rankMap[rank]; }
这样实现后,你就可以通过getRankName()方法获取卡牌的友好名称,通过getRank()获取数字形式的rank用于逻辑操作啦。
内容的提问来源于stack exchange,提问作者Rodbrollin
相关产品推荐
相关产品推荐

