我已经开始自学 C++,并一直在尝试编写一个二十一点程序。我正在尝试使用类来表示牌、牌组和手牌。我相信到目前为止,除了 dealCardToHand() 方法之外,程序中的所有内容都正常运行。
void dealCardToHand(deck& d, hand& h){
h.setCard(h.getCardsInHand(), d.dealCard());
h.setCardsInHand(h.getCardsInHand() + 1);
}
它似乎正确地增加了手中的牌数,但没有使用正确的数据调用 setCard()
方法。任何帮助,将不胜感激。我包括相关的类和方法:
class deck{
int topCard;
card * cards[52];
public:
deck();
void shuffle();
void printDeck();
card dealCard();
};
card deck::dealCard(){//returns top card of deck and increments top card one
return *cards[topCard++];
}
class hand{
card * handCards[12];
int cardsInHand;
public:
hand();
card getCard(int i){ return *handCards[i]; }
void setCard(int i, card c) { handCards[i] = &c; }
int getCardsInHand() { return cardsInHand; }
void setCardsInHand(int i) { cardsInHand = i; }
void printHand();
};
最佳答案
这很危险(可能至少是您问题的一部分):
void setCard(int i, card c) {handCards[i]=&c;}
这里,setCard(...)
按值传递一个 card
对象。这意味着将在临时位置创建调用者卡
的新拷贝。 setCard()
所作用的正是这个拷贝 (c
)。通过设置handCards[i]=&c;
,您可以保存该临时对象的位置。但是当 setCard()
返回时,该临时对象就不再有效。
但随后您继续在 getCard()
中取消引用 handCards[i]
。这会产生未定义的行为。从理论上讲,你应该预料到恶魔会开始从你的 Nose 里飞出来。实际上,您将看到 getCard()
返回的全部垃圾。或者崩溃。或者,如果您足够不幸,最后一个值可能会传递到 setCard()
。
总体而言,您似乎对指针的运用又快又松。我建议采用以下两种方法之一来解决该问题:
- 到处使用指针,切勿按值传递或返回。这可能会导致其他问题,但它们可能并不那么神秘。
- 不使用指针。按值传递和返回所有内容。
当然,这些不是唯一的选择,但它们可能会让您暂时的生活更轻松。
关于C++ 二十一点函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131340/