如何对构造函数的参数进行约束
How to make a constraint on the parameters of the constructor
现在我正在尝试为一副牌设计一个类。我有:卡片.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);
...
}
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 函数作为模板参数,是否对返回类型强制约束
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 将约束组合应用于参数包
- 约束模板参数顺序的更简单方法
- 如何约束参数类型以仅允许 std::initializer_list<size_t> 或 std::array<size_t, N>?
- 约束类型模板参数仅对特定模板进行实例化
- 约束模板参数取决于传递的函子
- 如何在C++17中强制执行模板和模板模板参数之间的约束
- 如何约束模板参数
- 对参数生存期的约束 std::regex_match(和 std::regex_search)
- 作为模板参数的可调用类型上的C++约束
- 如何对构造函数的参数进行约束
- 链接的模板模板参数-将内部参数约束为相同
- 如何约束模板参数以符合std::map中的Key
- 使用noexcept作为lambda修饰符或参数约束
- 带有auto特性的c++ 17模板参数是否允许约束std::函数对象?
- 模板参数的条件数值约束