C++ 定义类(C+;+;)中声明的变量的范围?
假设我有C++ 定义类(C+;+;)中声明的变量的范围?,c++,class,variables,range,restriction,C++,Class,Variables,Range,Restriction,假设我有类galaxy。此类中包含的合理变量为双质量。实际上,这是一个有内在限制的变量的例子,特别是考虑到我们今天知道的星系 我想知道的是:你将如何在类中编码这个限制?例如,我希望在尝试创建仙女座星系(不可行质量)时出错 如果您正在接收数据,显然可以对输入进行错误检查,但是有没有办法使这一点在类中固有?您可以使用一个简单的包装类简化输入检查,以使检查更容易 template<typename T, T MinRange_, T MaxRange_> struct RangeRestr
类galaxy
。此类中包含的合理变量为双质量
。实际上,这是一个有内在限制的变量的例子,特别是考虑到我们今天知道的星系
我想知道的是:你将如何在类中编码这个限制?例如,我希望在尝试创建仙女座星系(不可行质量)
时出错
如果您正在接收数据,显然可以对输入进行错误检查,但是有没有办法使这一点在类中固有?您可以使用一个简单的包装类简化输入检查,以使检查更容易
template<typename T, T MinRange_, T MaxRange_>
struct RangeRestrictedValue {
T value;
RangeRestrictedValue(const char* paramName_ = nullptr)
: value(doRangeCheck(T())), paramName(paramName_) {}
RangeRestrictedValue(const T& value_, const char* paramName_ = nullptr)
: value(doRangeCheck(value_)), paramName(paramName_) {}
RangeRestrictedValue& operator=(const T& value_) {
value = doRangeCheck(value_);
return *this;
}
static T& doRangeCheck(const T& value) {
std::ostringstream message;
message << (paramName ? paramName : "value") << " is out of range.";
if(value < MinRange_ || value > MaxRange_) {
throw std::out_of_range(message.str().c_str());
}
}
const char* paramName;
};
模板
结构RangeRestrictedValue{
T值;
RangeRestrictedValue(常量字符*参数名=nullptr)
:value(doRangeCheck(T())),paramName(paramName_551;){
RangeRestrictedValue(常量T&value,常量字符*参数名=nullptr)
:value(doRangeCheck(value_)),paramName(paramName_){
RangeRestrictedValue和运算符=(常量T和值_u3;){
value=doRangeCheck(value_ux);
归还*这个;
}
静态T&D检查(常数T&D值){
std::ostringstream消息;
消息我不是100%肯定的,但可能对您的案例有帮助。所以,基本上您想指定一个可以在编译时应用的监视值范围。您应该给我们一个更简洁的示例,您希望代码看起来像什么。没有办法在标准C++中声明有效范围。最常用的方法是测试输入。如果超出范围,则返回/抛出一个错误。在这种情况下,我建议不要在构造函数中使用它,而要使用封装来创建访问器和变异器,您需要在类的构造函数中检查范围,或者创建一个名为GalaxyMass
的类来检查其构造函数中的范围。@πάνταῥεῖ 是--我希望能够在类内定义一个mass
范围,这样我就无法在编译时创建一个值超出此范围的对象。顺便感谢您的回答!doRangeCheck
必须返回value
,否则将无法编译。否则这是一个很好的解决方案。只有三个建议:(1) 将value
设为private,添加一个getter函数和一个setter,执行与doRange
相同的检查。否则,可以在构造后破坏不变量。(2)添加一个static\u assert
以确保MinRange@Christian考虑到这一点,我已更改了我的答案。字符串文字不能作为模板值参数,因为它们具有内部链接。@yurikilochek好的,我将再次将其移回构造函数。@πάνταῥεῖ 虽然我以前没有使用过模板
,但我可以看到你的代码的功能。它的具体功能是什么?非常感谢你的快速回复!
class Galaxy {
private:
typedef RangeRestrictedValue<double,MIN_GALAXY_MASS,MAX_GALAXY_MASS> GalaxyMass;
GalaxyMass mass;
public:
Galaxy(double mass_) : mass(mass_,"mass") {}
double mass() const { return mass.value; }
void mass(double mass_) { mass = mass_; }
void doSomething() {
// access mass.value as you need to
}
};