定义在 class (C++) 中声明的变量的范围?
Defining ranges for variables declared in a class (C++)?
假设我有 class galaxy
。 class 中包含的一个合理变量是 double mass
。实际上,这是一个具有固有限制的变量示例,尤其是考虑到我们今天所知道的星系时。
我想知道的是:如何在 class 中对这个限制进行编码?例如,我在尝试创建 galaxy Andromeda(unfeasible mass)
时想要一个错误。
如果您正在接收数据,您显然可以对输入进行错误检查,但是有没有办法使它成为 class 中固有的?
您可以使用简单的包装器 class 简化输入检查,使检查更容易
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;
};
并像这样使用
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
}
};
假设我有 class galaxy
。 class 中包含的一个合理变量是 double mass
。实际上,这是一个具有固有限制的变量示例,尤其是考虑到我们今天所知道的星系时。
我想知道的是:如何在 class 中对这个限制进行编码?例如,我在尝试创建 galaxy Andromeda(unfeasible mass)
时想要一个错误。
如果您正在接收数据,您显然可以对输入进行错误检查,但是有没有办法使它成为 class 中固有的?
您可以使用简单的包装器 class 简化输入检查,使检查更容易
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;
};
并像这样使用
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
}
};