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