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