多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
本章选择纸牌作为研究对象的原因是,牌堆是一个很明显的纸牌向量的应用。 这是创建一副52张牌组成的新牌堆的代码: ~~~ apvector<Card> deck (52); ~~~ 这是对象的状态图: ![enter image description here](https://box.kancloud.cn/2015-09-02_55e64718cb601.jpg) 三个点代表我不想画出的48张牌。记住,我们尚未初始化纸牌实例变量。有些环境中,它们会初始化为0,就像图中这样,而在其他环境中它们可能包含任何可能的值。 一种初始化方法是,以一个Card对象为第二个参数调用向量的构造函数: ~~~ Card aceOfSpades (3, 1); apvector<Card> deck (52, aceOfSpades); ~~~ 这段代码创建了一副由52张同样的牌组成的牌堆,就像变魔术用的特殊牌。当然,创建一副由52张不同的牌组成的牌堆才更有意义。这可以使用嵌套循环实现。 外层循环枚举了花色,从0到3。对于每种花色,内部循环枚举了牌的大小,从1到13。因为外部循环迭代4词,内部循环迭代13词,循环体总的执行次数是52次(即13乘以4)。 ~~~ int i = 0; for (int suit = 0; suit <= 3; suit++) { for (int rank = 1; rank <= 13; rank++) { deck[i].suit = suit; deck[i].rank = rank; i++; } } ~~~ 我们使用变量i记录牌堆中要使用的下一张牌。 注意,我们可以把数组元素选择语法([]操作符)和对象的实例变量选择语法(点操作符)组合起来。比如表达式deck[i].suit意思是“牌堆中第i张卡的花色”。 作为练习,请把构建牌堆的代码封装为buildDeck函数,该函数不接受任何参数并返回一个完全填充的纸牌向量。