2013-08-26 126 views
0

我只是在10年后没有回到C++,于是决定尝试编写一个ASCII BlackJack游戏。我决定使用一个矢量来保存牌组和牌手,但是我发现,当我调用最初的交易功能时,应该为牌手矢量牌和牌手矢量牌分配2张牌,它出来后,我想打印手,我得到了一个界外例外。写出来的函数出来后向量会丢失数据

下面的代码片段!

void deck::initialDeal(player dealer, player player1) 
{ 
    for(int i = 0; i < 2 ; i++) 
    { 
     dealer.addHand(myDeck[i]); 
     myDeck.erase(myDeck.begin()); 
     player1.addHand(myDeck[i]); 
     myDeck.erase(myDeck.begin()); 
    } 
} 

以上只是需要一对夫妇的卡从我的主甲板,并调用addHand常规的卡添加到玩家矢量手:

void player::addHand(card dealtCard) 
{ 
    hand.push_back(dealtCard); 
} 

如果我把一个程序来输出该addHand函数内部,它工作正常,手矢量显示数据插嘴说。

但是,后来我想用手打印到屏幕等有()

称为printHand另一个功能
void player::printHand() 
{ 
    if (dealer == true) 
    { 
     cout << hand[0].getNumber() << hand[0].getSuit() << " "; 
     cout << hand.size() << endl; 
    } 
    else 
    { 
     for(std::vector<card>::size_type x = 0 ; x != hand.size() ; x++) 
     { 
      cout << hand[x].getNumber() << hand[x].getSuit() << " "; 
     } 
    } 
} 

目前我只是处理经销商方面,所以它进入功能的经销商分支和那当我得到错误。

我觉得我应该在这里使用指针,因为在addHand()函数中创建的数据一旦完成就会被删除?

回答

5

你似乎通过复制所有参数,而不是通过引用(并参考我不是指针)。这意味着您只修改副本而不是原件。

如果修改函数原型是这样的:

void initialDeal(player& dealer, player& player1) 

参数通过引用传递代替,并允许你修改原始对象被作为参数传递。

+0

啊我知道这跟这个范围有关。谢谢哥们!非常感激!我会放弃它。 – user2718166

+0

工作了一半,感谢Joachim! – user2718166

+2

@ user2718166:请注意,修改其参数的函数通常会使代码难以维护,因为您需要考虑很多关于在哪里修改的地方。我建议在一个类中包装矢量并使用正确命名的方法来修改它。 –