C++ c++;:尝试用const成员构造类

C++ c++;:尝试用const成员构造类,c++,exception,constructor,try-catch,constants,C++,Exception,Constructor,Try Catch,Constants,考虑以下类别: class MyClass { private: const unsigned int num;//num identifies the object. needs to be const unsigned int checkNum(unsigned int);// verifies that num has a valid value public: MyClass(unsigned int n): num(checkNum(n)) {} }; un

考虑以下类别:

class MyClass
{
private:
    const unsigned int num;//num identifies the object. needs to be const
    unsigned int checkNum(unsigned int);// verifies that num has a valid value

public:
    MyClass(unsigned int n): num(checkNum(n)) {}
};

unsigned int MyClass:checkNum(unsigned int n)
{
    if (some_condition)
        throw std::invalid_argument("Invalid number");
    return n;
}
困难在于,由于范围检查,对象必须在
try
块中构造:

int main()
{
    try {
        MyClass mc(1000);
    }
    catch (std::invalid_argument &ia)
    {
        std::cout << ia.what();
    }
    return 0;
}
是否有其他/更好的解决方案

在你的第1点中,“在许多情况下不实用”完全是错误的

try
块是处理故障的解决方案

另一种选择是不处理它


在其他新闻中,在您的第2点中,“不要使MyClass::num const.Not good,它应该在对象的持续时间内是不可变的。”这是非常值得怀疑的。这在某种程度上取决于个人意见,但从技术上讲没有问题。此外,
常数和范围检查之间没有联系:假设的联系根本不存在。

在你的第1点中,“在许多情况下不实用”是错误的

try
块是处理故障的解决方案

另一种选择是不处理它



在其他新闻中,在您的第2点中,“不要使MyClass::num const.Not good,它应该在对象的持续时间内是不可变的。”这是非常值得怀疑的。这在某种程度上取决于个人意见,但从技术上讲没有问题。此外,
const
和范围检查之间没有任何联系:假设的联系根本不存在。

当其构造被视为无效,并通过异常“取消”时,您打算如何处理
mc

try
扩展对象的整个范围是非常有意义的


mc
不应在
try
块之外访问。
当其构造被视为无效,并通过异常“取消”时,您打算如何处理
mc

try
扩展对象的整个范围是非常有意义的


mc
不应在
try
块之外访问。

在使用它构造
mc
对象之前,应验证ID号。不要在构造函数内部进行验证:

class MyClass
{
private:
    const unsigned int num;

public:
    MyClass(unsigned int n): num(n) {}
};

unsigned int checkNum(unsigned int n)
{
    if (some_condition)
        throw std::invalid_argument("Invalid number");
    return n;
}

int main()
{
    unsigned int num;
    try {
        num = checkNum(some_input);
    }
    catch (std::invalid_argument &ia)
    {
        std::cout << ia.what();
        return -1;
    }
    MyClass mc(num);
    return 0;
}
class-MyClass
{
私人:
常量unsigned int num;
公众:
MyClass(无符号整数n):num(n){
};
无符号整数checkNum(无符号整数n)
{
如果(某些条件)
抛出std::无效的_参数(“无效数字”);
返回n;
}
int main()
{
无符号整数;
试一试{
num=checkNum(一些输入);
}
捕获(标准::无效的_参数&ia)
{

std::cout在用它构造
mc
对象之前,应该验证ID号。不要在构造函数内部进行验证:

class MyClass
{
private:
    const unsigned int num;

public:
    MyClass(unsigned int n): num(n) {}
};

unsigned int checkNum(unsigned int n)
{
    if (some_condition)
        throw std::invalid_argument("Invalid number");
    return n;
}

int main()
{
    unsigned int num;
    try {
        num = checkNum(some_input);
    }
    catch (std::invalid_argument &ia)
    {
        std::cout << ia.what();
        return -1;
    }
    MyClass mc(num);
    return 0;
}
class-MyClass
{
私人:
常量unsigned int num;
公众:
MyClass(无符号整数n):num(n){
};
无符号整数checkNum(无符号整数n)
{
如果(某些条件)
抛出std::无效的_参数(“无效数字”);
返回n;
}
int main()
{
无符号整数;
试一试{
num=checkNum(一些输入);
}
捕获(标准::无效的_参数&ia)
{

std::cout您可以使用函数try block来防止在try block之外使用mc

int main() try{

  return 0;
} catch(...) {

}

您可以使用函数try-block来防止在try-block之外使用mc

int main() try{

  return 0;
} catch(...) {

}

我很确定你的意思是
checkNum
checkPin
同名。请在SO问题中发布真实代码。至少有一个答案似乎被误导了。我很确定你的意思是
checkNum
checkPin
同名。请在SO问题中发布真实代码。至少一个答案似乎被这一点误导了。