2013-11-24 175 views
1

我尝试初始化一个类的数组,然后使用循环更改每个对象中的数据成员。我不知道如何让这些值保持不变,因为在我更改了这些值之后,我试图打印出一个随机对象,它只是默认值而不是更改后的值。任何帮助将不胜感激,谢谢!在C++中初始化类

#include <iostream> 
#include <string> 
#include <time.h> 
using namespace std; 

class card { 
private: 
    int rank; 
    int suit; 
//////////////////////////////////////////////////////////// 
public: 
///////////////////////////////////////////////////////////// 
// default constructor with initialization list 
    card(int userRank = (2,3,4,5,6) , int userSuit=15) 
    :rank(userRank), suit(userSuit){} 
/////////////////////////////////////////////////////////// 
// function to validate user's rank choice. 
int cardcheckRank(int pRank){ 
    while(pRank<2 || pRank>14) 
    { 
     cout << "Choose a playing card rank between 2-14, where 11=Jack, " 
      "12=Queen, 13=King, 14=Ace"<<endl; 
     cin >> pRank; 
    } 
    return pRank; 
} 

///////////////////////////////////////////////////////////// 
// function to validate user's suit choice. 
int cardcheckSuit(int pSuit){ 
while(pSuit<15 || pSuit>18) 
{ 
    cout << "Choose a playing card suit " 
    "between 15-18, where 15=Diamond, 16=Club, 17=Heart, 18=Spades.";         
cin >> pSuit; 
    } 
    return pSuit; 
} 

////////////////////////////////////////////////////////////////// 
// functioin to get a card value from user. 
void storeCard(int pRank, int pSuit){ 

    card(cardcheckRank(pRank),cardcheckSuit(pSuit)); 
} 

///////////////////////////////////////////////////////////////// 
// translates 
string faceRank(int translateRank){ 
switch (translateRank) { 
    case 2: 
     return "Two"; 
    case 3: 
     return "Three"; 
    case 4: 
     return "Four"; 
    case 5: 
     return "Five"; 
    case 6: 
     return "Six"; 
    case 7: 
     return "Seven"; 
    case 8: 
     return "Eight"; 
    case 9: 
     return "Nine"; 
    case 10: 
     return "Ten"; 
    case 11: 
     return "Jack"; 
    case 12: 
     return "Queen"; 
    case 13: 
     return "King"; 
    case 14: 
     return "Ace"; 
    default: return "Invalid"; 
    } 
} 
/////////////////////////////////////////////////////////// 
// translate integer suit value into a word. 
string faceSuit(int translateSuit){ 
switch (translateSuit){ 
    case 15: 
     return "Diamonds"; 
     break; 
    case 16: 
     return "Clubs"; 
     break; 
    case 17: 
     return "Hearts"; 
     break; 
    case 18: 
     return "Spades"; 
     break; 
    default: return "Invalid"; 
    } 
} 
/////////////////////////////////////////////////////// 
// Function to print the current card. 
void printCard(){ 

    cout << "The rank of the card is "; 
    cout << faceRank(rank); 
    cout << " and the suit is " << faceSuit(suit) << "." << endl; 
} 
}; // End of card class. 
////////////////////////////////////////////////////// 
// main function. 
int main() 
{ 
srand (time(NULL)); // initialize random seed. 
card deck[52]; 

char choice = 'n'; 
int h = 0; // card number. 

    for(int i = 15; i < 19; i++) 
    { 
     int y = i; 
     for(int j =2; j < 15; j++) 
     { 
      int z = j; 
      (deck [h]).storeCard(z,y); 
      cout << "Card rank " << (deck [h]).faceRank(z); 
      cout << ", suit " << (deck [h]).faceSuit(y) <<endl; 
      ++h; 
     } 
    } 

do{ 
    cout <<"Would user like to play?(y/n)"<<endl; 
    cin >> choice; 
    int ranNum = (rand()% 51 + 0); 
    if(choice == 'y') 
    { 
     cout << "User: "; 
     deck[7].printCard(); 
    } 
} 
while(choice == 'y'); 
return 0; 
} 
+1

在你的构造函数中发生了一些奇怪的事情。 'userRank'的默认值是6.稍后,你创建一个'card'对象并将其扔掉。 – chris

+0

我真的不明白,但我试图设置一个默认值,只给对象一些东西,但是打算让整个数组成为一副牌,每张牌都是一个对象。 – Davy2468

回答

1

值不坚持,因为你storeCard功能并没有真正存储卡,它会创建一个新的card对象和它扔了出去。如果你真的想通过调用card构造函数来表达这一点,那么所构造的对象分配到当前的一个:

void storeCard(int pRank, int pSuit){ 
    *this = card(cardcheckRank(pRank),cardcheckSuit(pSuit)); 
} 

更惯用的方法是为storeCard直接修改对象的属性,就像构造函数:

void storeCard(int pRank, int pSuit){ 
    rank = cardcheckRank(pRank); 
    suit = cardcheckSuit(pSuit); 
} 
+0

谢谢你,我尝试了关于使用惯用方法的建议,并且这些值现在仍然存在。再次感谢! – Davy2468

+0

@ Davy2468了解您的实现失败的原因也很重要。虽然构造函数*看起来像一个普通的函数,但不能直接调用它。调用构造函数被解释为构造一个* new *对象 - 并将它悬在空中。除非你把它分配给某些东西(就像我在修改的'storeCard'中做的那样),否则它将会消失,甚至被优化器完全消除。 – user4815162342