2011-04-10 3 views
1

이것은 강사가 제공 한 드라이버 코드입니다.이 태그는 나와 편집하지 않아도됩니다.내 코드를 확인하는 데 도움이 필요합니다. 리뷰가 크게 잘못되었습니다.

PlayingCardTest.cpp :

#include <iostream> 
#include "PlayingCard.h" 

PlayingCard makeValidCard(int value, int suit); 

int main() 
{ 
    // Create a playing card 
    PlayingCard card1; 

    // Test the default constructor and GetCardCode 
    std::cout << "Testing default constructor. Expect card code to be 00\n card code is :"; 
    std::cout << card1.getCardCode() << std::endl << std::endl; 

    // Test the setter and getter 
    std::cout << "Seting card to 'AH' using SetValue and SetSuit" << std::endl; 
    card1.setCard('A', 'H'); 
    std::cout << "GetValue returns :" << card1.getValue() << std::endl; 
    std::cout << "GetSuit returns :" << card1.getSuit() << std::endl << std::endl; 

    // Test overloaded constructor 
    PlayingCard tenOfSpades('T', 'S'); 
    std::cout << "Testing overloaded constructor. Expect card code to be TS\n card code is :"; 
    std::cout << tenOfSpades.getCardCode() << std::endl << std::endl; 

    // Test IsValid with valid cards 
    std::cout << "Testing valid card codes.\n" 
     << "Expect isValid to return true for all (except perhaps Jokers.)" 
     << std::endl; 
    // Create and test valid cards 
    int validCards = 0;  // cards that return true for IsValid 
    int invalidCards = 0; // cards that return false for IsValid 

    // Create and test four suits plus the jokers 
    for(int suit = 1; suit <= 5; suit++) 
    { 
     // Create and test ace, 2 - 9, Jack, Queen, and King 
     for(int value = 1; value <= 13; value++) 
     { 
      PlayingCard aCard = makeValidCard(value, suit); 
      std::cout << "Card Code: " << aCard.getCardCode() << " IsValid :"; 
      if (aCard.isValid()) 
      { 
       validCards++; 
       std::cout << "true" << std::endl; 
      } 
      else 
      { 
       invalidCards++; 
       std::cout << "false" << std::endl; 
      } 
      // suit 5 is just for creating the two Jokers 
      if (suit == 5 && value >= 2) 
       break; 
     } 
    } 
    std::cout << "IsValid returned false for " << invalidCards << " card codes" << std::endl; 
    std::cout << "IsValid returned true for " << validCards << " card codes" << std::endl; 
    std::cout << std::endl; 

    // Test IsValid with invalid cards 
    // Create and test invalid cards 
    std::cout << "Testing invalid card codes; isValid should return false for all." << std::endl; 
    validCards = 0; 
    invalidCards = 0; 
    // Loop through all possible ASCII character codes for card codes 
    for(int suit = 0; suit <= 255; suit++) 
     for(int value = 0; value <= 255; value++) 
     { 
      // Only check card codes that are not valid 
      PlayingCard aCard = makeValidCard(value, suit); 
      if (aCard.getCardCode() == "00") 
      { 
       if (aCard.isValid()) 
       { 
        std::cout << "value :" << value << " suit :" <<suit << " IsValid :"; 
        std::cout << "true" << std::endl; 
        validCards++; 
       } 
       else 
       { 
        invalidCards++; 
       } 
      } 
     } 
     std::cout << "IsValid returned false for " << invalidCards << " card codes" << std::endl; 
     std::cout << "IsValid returned true for " << validCards << " card codes" << std::endl; 

    return 0; 
} 

/******************************************************/ 
/* Test Functions          */ 
/******************************************************/ 

PlayingCard makeValidCard(int iValue, int iSuit) 
{ 
    char value = '0'; 
    char suit = '0'; 

    switch (iValue) 
    { 
    case 1: 
     value = 'A'; 
     break; 
    case 10: 
     value = 'T'; 
     break; 
    case 11: 
     value = 'J'; 
     break; 
    case 12: 
     value = 'Q'; 
     break; 
    case 13: 
     value = 'K'; 
     break; 
    default: 
     if ((iValue >= 2) && (iValue <= 9)) 
      value = '0' + iValue; 
     break; 
    } 

    switch (iSuit) 
    { 
    case 1: 
     suit = 'D'; 
     break; 
    case 2: 
     suit = 'S'; 
     break; 
    case 3: 
     suit = 'C'; 
     break; 
    case 4: 
     suit = 'H'; 
     break; 
    // Special case for the Joker 
    case 5: 
     if(iValue == 1) 
     { 
      value = 'Z'; 
      suit = 'B'; 
     } 
     else if(iValue == 2) 
     { 
      value = 'Z'; 
      suit = 'R'; 
     } 
     else 
     { 
      value = '0'; 
      suit = '0'; 
     } 
     break; 
    } 

    PlayingCard testCard(value, suit); 
    return testCard; 
} 

이 내 헤더 파일, PlayingCard.h :

#ifndef PLAYINGCARD_H_INCLUDED 
#define PLAYINGCARD_H_INCLUDED 

class PlayingCard 
{ 
private: 
    char suit, value; 

public: 
    PlayingCard(){suit = '0'; value = '0';} 
    PlayingCard(char myValue, char mySuit); 

    char getValue() {return value;} 
    char getSuit() {return suit;} 

    std::string getCardCode(); 
    bool setCard(char myValue, char mySuit); 
    bool isValid(); 

#endif // PLAYINGCARD_H_INCLUDED 

그리고 이것은 내 클래스 구현 파일입니다 PlayingCard.cpp :

#include "PlayingCard.h" 

PlayingCard::PlayingCard (char myValue, char mySuit) 
{ 
    char aValue[13] ('2','3','4','5','6','7','8','9','T','J','Q','K','A')) 
    char aSuit[4] {'D','H','C','S'] 

    for(count = 0; count <= 12; count++) 
    { 
     if (myValue = aValue[count]) 
     { 
      for (count2 = 0; count2 <= 3; count2++) 
      { 
       if (mySuit = aSuit[count2++]) 
       { 
        suit = mySuit; 
        value = myValue; 
       } 
      } 
     } 
    } 
} 

bool PlayingCard::setCard(char myValue, char mySuit) 
{ 
    char aValue[13] ('2','3','4','5','6','7','8','9','T','J','Q','K','A')) 
    char aSuit[4] {'D','H','C','S'] 

    for(count = 0; count <= 12; count++) 
    { 
     if (myValue = aValue[count]) 
     { 
      for (count2 = 0; count2 <= 3; count2++) 
      { 
       if (mySuit = aSuit[count2++]) 
       { 
        suit = mySuit; 
        value = myValue; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
    } 
} 

string PlayingCard::getCardCode() 
{ 
    return suit + value; 
} 

bool PlayingCard::isValid() 
{ 
    char aValue[13] ('2','3','4','5','6','7','8','9','T','J','Q','K','A')) 
    char aSuit[4] {'D','H','C','S'] 

    for(count = 0; count <= 12; count++) 
    { 
     if (myValue = aValue[count]) 
     { 
      for (count2 = 0; count2 <= 3; count2++) 
      { 
       if (mySuit = aSuit[count2++]) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
    } 
} 

그리고 이것은 내가 얻는 컴파일러 오류입니다. 무엇을해야할지 모르겠다. 내가 편집해서는 안되는 파일에있는 것처럼 보입니다. 나는 네가 줄 수있는 도움에 정말로 감사 할 것이다.

PlayingCardTest.cpp|103|error: 'PlayingCard PlayingCard::makeValidCard(int, int)' cannot be overloaded|

PlayingCardTest.cpp|5|error: with 'PlayingCard PlayingCard::makeValidCard(int, int)'|

PlayingCardTest.cpp|169|error: expected '}' at end of input|

PlayingCardTest.cpp|169|error: expected unqualified-id at end of input|

||=== Build finished: 4 errors, 0 warnings ===|

+2

http://codereview.stackexchange.com에서 질문 할 수 있습니다. –

+3

@GregHewgill : 사실, 이것은 코드 리뷰에서 주제와 관련이 없습니다. 코드 검토는 기존의 작업 코드를 개선하기위한 것입니다. 그의 코드는 컴파일되지 않았으며, 컴파일 오류를 돕는 것은 여기서 다루고 있습니다. – Will

+0

@ 윌 : 고마워, 내가 그걸 명심 할께. –

답변

1

1 라운드 :

  1. 스타일 니트 : 주문 섹션 "공공"다음 "개인", "보호". 비공개 섹션은 공개 될 수 없습니다. 이것은 기술적으로 요구되는 것은 아니지만 상당히 표준적인 방법입니다.
  2. 스타일 nit : 별도의 명령문을 사용하여 각 변수를 선언하십시오. 각 변수는 자체 행에 있습니다. 쉼표를 사용하면 문제가 발생하기 쉽고 (예 : 포인터 유형을 선언 할 때) 좋지 않은 스타일입니다.
  3. 할당 연산자를 사용하는 대신 생성자에서 초기화 목록을 사용하십시오.
  4. std :: string을 사용하려면 헤더에 "<string>"을 포함해야합니다. 코멘트

두 번째 라운드 : 당신은 이상하게 당신의 배열을 초기화하는

  1. ; {}를 대괄호로 사용해야합니다.
  2. 초기화 할 때 배열의 크기를 지정할 필요가 없습니다.
  3. 스타일 nit : 코드에서 "12"와 같은 마법 상수를 사용하지 마십시오. 대신 value_length 또는 value_count와 같은 변수에 할당하고 명명 된 변수를 사용하십시오.
  4. if 문에서 equals 비교 ("==") 또는 과제 ("=")를 수행 했습니까? 과제를하려는 경우 if의 바깥으로 이동해야합니다. 코멘트

세 번째 라운드 :

  1. 당신은 불필요하게 기본이 아닌 생성자와 setCard 기능 사이의 코드 중복. 이 두 함수간에 코드를 공유 할 수 있어야합니다. setCard는 가상 함수가 아니므로 생성자에서 간단하게 호출 할 수 있어야합니다.
  2. 귀하의 setCard 로직이 상당히 복잡해 보입니다.대부분의 "설정"기능은 그보다 훨씬 사소합니다. 당신은 무엇을하려고하는지에 대한 논리를 설명하는 문서를 추가하는 것을 고려해야합니다.
  3. "getValue()", "getCardCode()", "getSuit()"및 "isValid()"함수는 "const"로 선언해야합니다. 코멘트

네 번째 라운드 :

  1. 당신의 교수가하는 때문에 "플레잉 카드 카드 = makeValidCard (...)", 그가 할당을 지원하기 위해 카드 클래스를 원하는 것이 분명하다. "setCard()"함수와 기본이 아닌 생성자가 단순히 속성을 설정하는 것 이외의 다른 작업을 수행하기 때문에 "PlayingCard & 연산자 = (const PlayingCard &);" 할당 연산자 및 "PlayingCard :: PlayingCard (const PlayingCard &)"복사본 생성자가 있습니다. 이러한 정보를 제공하지 않으면 기본 할당/복사를 사용하여 복사하는 것이 의도적으로 허용되었다는 취지에 주석을 추가하는 것이 좋습니다.
+0

정말 고마워. 지금 일하고있어. –

2

헤더 파일의 끝에 };이 누락되었습니다. 코멘트

관련 문제