当调用改变它的成员函数时,不改变C对象成员
c object member not being changed when member function that changes it is called
我正在创建一个可以处理扑克牌的简单程序。我已经开始制作手牌,但我遇到了一个问题:当发手牌时,牌不会从牌堆中移除。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)
原因:
按值传递牌组,即在发牌时复制牌组。副本是被还原的。原来的牌组不是。通过引用传递它,原始甲板将被修改。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 对列表中的每个对象调用成员函数,以改变对象所在的列表
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 当函数应该改变对象的状态时,是选择成员函数还是朋友函数
- 类的公共成员值没有改变
- this指针在调用成员函数时改变
- 被非const成员函数改变的可变变量
- 静态方法中的对象创建是改变其他静态对象的私有成员变量
- 基于单独的模板化成员改变类的模板化成员函数的返回类型
- c++单元测试:改变成员范围
- 班级成员不情愿地改变了
- 为什么cocos2d-x schedule改变了成员对象
- 当调用改变它的成员函数时,不改变C对象成员