2012-03-31 5 views
1

이제 카드 갑판에 대한 클래스를 설계하려고합니다. 내가 가진 : Card.h 매개 변수를 사용하여 생성자를 들어생성자의 매개 변수에 제약 조건을 설정하는 방법

class Card { 
public: 
    enum Suit { CLUBS = 1, SPADES, HEARTS, DIAMONDS, RED_JOKER, BLACK_JOKER }; 
    Card(int card, Suit suit); 

private: 
    int _card; 
    Suit _suit; 
}; 

, 나는 카드에 제약 조건을 만들려고하고, 그것의 범위는 13-1, 그래서 나는이 같은 생성자를 쓰기 위하여려고하고있다 :

Card::Card(int card, Suit suit) throw (int) { 
    if (card < 1 || card > 13) { 
     delete this; 
     throw card; 
    } 
} 

나는 작성자를 작성하는 방식이 우아하다고 생각하지 않습니다. 또한 카드에 enum을 추가하는 것을 고려합니다. 그러나이 질문에 대해서만 효과가 있습니다. 1에서 100000 사이의 값을 확인해야 할 경우 어떻게해야합니까? 누군가 제안 할 수 있습니까? 감사합니다.

답변

4

건설 중 값을 확인하는 것이 좋습니다. 그러나 이 아닌delete으로 전화하십시오. this으로 전화하십시오. 시스템은 오브젝트에 메모리가 할당 된 경우 예외가 전파 될 때 해제된다는 것을 확인합니다.

더 나은 구현 (제 생각에) 될 것이다 :

Card::Card(int card, Suit suit) { 
    if (card < 1 || card > 13) { 
     throw std::runtime_error("Invalid card value"); 
    } 
} 
+3

작은 nitpick 예외 지정자가 더 이상 사용되지 않습니다. (noexcept는 예외입니다.) – luke

+0

@luke : 나는 깨달았습니다. 질문에서 생성자를 복사 한 다음 수정했습니다. 예외 지정자가 옳다면 전혀 의미가 없습니다. –

1

가 당신에게 (예외없이) 실제 사용 시나리오에서 범위를 벗어난 값으로 호출 할 수있는 생성자를 믿을만한 이유가 있습니까? 나에게는 가능성이 없기 때문에 정의되지 않은 입력에 대한 동작을 지정하고 예외를 전혀 throw하지 않습니다. 개발 중에는 이전의 assert을 추가 할 수 있습니다.이 방법은 문제의 위치를 ​​즉시 알려주기 때문에 디버그 목적으로 유용합니다. 따라서 잎은 똑 바른 코어 덤프를 생성 할 수 있습니다.

#include <cassert> 

Card::Card(int card, Suit suit) { 
    assert(card >= 1 && card <= 13); 
    ... 
} 
+0

답변 해 주셔서 감사합니다. 내 프로그램이 중단되기를 원하지 않는다. – lingguang1997

2

왜 int가 아닌 enum으로 카드 번호를 만들까요? 컴파일 시간에 오류가보고됩니다.

+0

카드 수업에도 좋은 생각이라고 생각합니다. 나는 단지 검증을 수행하는 일반적인 방법을 알기를 희망한다. 감사. – lingguang1997

관련 문제