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问题中发布真实代码。至少一个答案似乎被这一点误导了。