2012-03-31 65 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; 
}; 

對於參數的構造函數,我打算讓卡的限制,它的範圍是1到13,所以我打算寫這樣的構造:

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

我不認爲我寫這個構造函數的方式是優雅的。 我也考慮添加卡的枚舉。但它只適用於這個問題。 如果我需要檢查1到100000的值,那麼怎麼辦? 任何人都可以提出一些建議嗎? 非常感謝!

回答

4

在施工期間檢查數值是一個好主意,但您應該而不是請致電deletethis。系統將確保如果爲該對象分配了內存,則在異常傳播時它將被釋放。

更好的實現(在我看來)是:

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

小的nitpick-異常說明符已被廢棄(除了'noexcept') – luke 2012-03-31 01:03:40

+0

@luke:我什至沒有意識到。我從問題中複製構造函數,然後進行修改。你說得對,因爲異常說明符根本就沒有任何意義。 – 2012-03-31 01:07:29

1

你是否有理由相信該構造可能在任何(特殊或不)實際使用情況與範圍以外的值被稱爲?對我來說這似乎不太可能,所以我寧願將其行爲指定爲未定義的輸入,也不要拋出任何異常。在開發過程中,您可以添加一個很好的舊版本assert,這對於調試目的來說非常有用,因爲它可以立即告訴問題的位置和離開,從而生成一個簡單的核心轉儲。

#include <cassert> 

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

感謝您的回答。我不希望我的程序中止。 – lingguang1997 2012-04-03 00:27:52

2

爲什麼不讓你的卡號作爲枚舉而不是int。這會在編譯時報告錯誤

+0

我認爲對於班級卡也是一個好主意。我只是希望知道一個通​​用的方法來做驗證。謝謝。 – lingguang1997 2012-04-03 00:27:17

相關問題