Рассмотрит следующий класс:C++: Попробуйте поймать на строительстве класса с константным членом
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;
}
Проблема в том, что mc
не доступен за пределами блока try
.
Возможные решения:
Расширение
try
блока по всей сферы, гдеmc
используется. Во многих случаях это не практично.Не бросайте исключение в конструктор, но потом его бросить будет слишком поздно.
Единственное приемлемое решение, которое я могу думать о том, чтобы использовать смарт-указатели, чтобы принести декларацию за пределами try
блока:
int main()
{
std::unique_ptr<MyClass> my_class_ptr;
try {
my_class_ptr = std::make_unique<MyClass>(1000);
}
catch (std::invalid_argument &ia)
{
std::cout << ia.what();
}
return 0;
}
Есть ли другие/более эффективные решения?
Я уверен, что вы имели в виду для 'checkNum' и' checkPin' одноименное имя. Пожалуйста, напишите ** реальный код ** в вопросах SO. По крайней мере, один ответ, похоже, был введен в заблуждение. –