定义类(C ++)中声明的变量的范围?

时间:2017-02-23 17:40:20

标签: c++ class variables range restriction

说我有class galaxy。在此课程中包含的合理变量为double mass。实际上,这是一个具有固有限制的变量的例子,特别是考虑到我们今天所知的星系。

我想知道的是:你如何在课堂上编码这个限制?我想在尝试创建galaxy Andromeda(unfeasible mass)时出错。

如果您正在接收数据,您显然可以对输入进行错误检查,但有没有办法在课堂上实现这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用简单的包装类简化输入检查,以便更轻松地进行检查

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
    }
};