如何对构造函数的参数进行约束

时间:2012-03-31 00:44:45

标签: c++

现在我正在尝试为一副牌设计一个班级。 我有: 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之间的值怎么办? 谁能提出一些建议? 非常感谢!

3 个答案:

答案 0 :(得分:4)

最好在构建期间检查值,但您应该 delete上调用this。系统将确保如果为对象分配了内存,则在异常传播时释放该内存。

更好的实施(在我看来)将是:

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

答案 1 :(得分:2)

为什么不将您的卡号设为enum而不是int。这会在编译时报告错误

答案 2 :(得分:1)

您是否有理由相信构造函数可能在任何(特殊或非特定)实际使用场景中调用超出范围的值?对我来说似乎不太可能,所以我宁愿将其行为指定为未定义的输入,也不要抛出任何异常。在开发过程中,您可以添加一个好的旧assert,这对于调试目的更有用,因为它会立即告诉问题的位置并离开,从而允许生成直接的核心转储。

#include <cassert>

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