当调用改变它的成员函数时,不改变C对象成员

c object member not being changed when member function that changes it is called

本文关键字:改变 成员 对象 函数 调用      更新时间:2023-10-16

我正在创建一个可以处理扑克牌的简单程序。我已经开始制作手牌,但我遇到了一个问题:当发手牌时,牌不会从牌堆中移除。deck是包含花色、值和颜色的卡牌对象的向量。

这只是我为它写的简短测试程序:

Deck testDeck; //default deck is in order
cout << testDeck << endl; //print the deck out
Hand testHand(5, testDeck); //generate a hand of 5 cards from testDeck
cout << testHand << endl; //print the hand
cout << testDeck << endl; //print the deck

初始化的deck

2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH AH 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD AD
2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS AS

从牌组中获得5张牌的样本手牌

2H 3H 4H 5H 6H

牌组应该缺少5张牌,但它只是返回了最初的牌组,就好像什么都没有发生。

2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH AH 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD AD
2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS AS

这是我的手部构造函数:

Hand::Hand(int numCards, Deck myDeck)
{
    myHand = myDeck.takeTopXCards(numCards);
}

下面是takeTopXCards函数:

vector<Card> Deck::takeTopXCards(int numCards)
{
    vector<Card> retCards;
    for(int i = 0; i < numCards; i++)
        retCards.push_back(takeTopCard());
    return retCards;
}

当然,还有TakeTopCard函数:

Card Deck::takeTopCard()
{
    Card ret = myDeck[0];
    myDeck.erase(myDeck.begin());
    return ret;
}

我通过打印myDeck[0] (myDeck是Deck类的私有数据成员)在使用erase之前和之后检查了takeTopCard函数,它工作得很好。由于某种原因,一旦takeTopXCards返回,传递给它的Deck对象(测试程序中的testDeck)不会改变。

如果你想看其他的,只要问我,我会把它加到末尾。谢谢。

修改如下:

Hand::Hand(int numCards, Deck myDeck)

:

Hand::Hand(int numCards, Deck& myDeck)

原因:

按值传递牌组,即在发牌时复制牌组。副本是被还原的。原来的牌组不是。通过引用传递它,原始甲板将被修改。