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

How to make a constraint on the parameters of the constructor

本文关键字:约束 参数 构造函数      更新时间:2023-10-16

现在我正在尝试为一副牌设计一个类。我有:卡片.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之间的值,该怎么办?有人能给点建议吗?非常感谢!

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

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

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

为什么不将卡号作为枚举而不是int。这会导致编译时中报告错误

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

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