Quiero restringir la entrada de un numero de 1 a 10, usando un try catch por si el usuario ingresa un numero fuera de rango que me tire la excepcion out_of_range. Como defino el subrango de int de 1 a 10 en la clase??? gracias de antemano
Yo no usaria un try/catch para evaluar un rango, un simple if te bastaria:
If (value < 1 || value > 10) { throw new out_of_range(); }
Salu2...
try {
if (num < 1 || num > 10)
throw std::out_of_range("Ingresa numeros correctos..JODER!!!");
// codigo
...
}
catch ( std::out_of_range oor) {
std::cout << oor.what();
}
También es posible incorporar la lógica de la comprobación del rango dentro del propio tipo numérico. A modo de ejemplo (y como tal muy simple, limitado y abierto a multitud de adiciones y modificaciones):
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
template <int min, int max>
struct ThrowOnOutOfRange
{
static int check_value(int new_value)
{
if (new_value < min || new_value > max)
{
std::ostringstream oss;
oss << "Value " << new_value << " out of range [" << min << ", " << max << "]!";
std::string error_msg(oss.str());
throw std::out_of_range(error_msg.c_str());
}
return new_value;
}
};
template <int min, int max,
class ErrorPolicy = ThrowOnOutOfRange<min, max> >
class checked_int
{
public:
explicit checked_int(int i = min)
: value_(ErrorPolicy::check_value(i)) {}
// todas las funciones miembro necesarias...
private:
int value_;
};
int main()
{
try
{
checked_int<1, 10> n(15);
}
catch (const std::out_of_range& e)
{
std::cout << e.what() << std::endl;
}
return 0;
}
Es interesante notar que se puede definir toda una batería de políticas de actuación en caso de intentar asignar un valor fuera del rango estipulado (lanzar una excepción, modular el valor, etc.).
Que quieres que te diga, para una simple comprobacion de rango a mi me parece matar moscas a cañonazos, pero weno :D
Salu2...
De hecho, para _una simple_ comprobación de rango es matar moscas a cañonazos. Pero, en ocasiones, en el mundo real las cosas no son tan simples.