调用更改它的成员函数时,不更改c对象成员

时间:2012-12-31 22:24:07

标签: c++ class function object member

我正在创建一个可以处理扑克牌的简单程序。我已经开始创造一只手了,但我遇到了一个问题:当手牌被发出时,卡片不会从牌组中移除。甲板是卡片对象的矢量,包含西装,价值和颜色。

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

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

初始化的牌组

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;
}

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

如果你想看到其他任何东西,请问我,我会在这里添加它。感谢。

1 个答案:

答案 0 :(得分:2)

改变这个:

Hand::Hand(int numCards, Deck myDeck)

对此:

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

为什么:

你正在通过甲板上的值,它在交易时正在复制它。副本是减少的。原来的甲板不是。通过引用传递它,原始套牌将被修改。