Despues de quebrarme el coco un poco he conseguido dos formas de hacer lo que pedia:
Código C++:
Ver original//---------------------------------------------------------------------------
#include <iostream>
#include <cstring.h>
bool ObtenerEnteroMetodo1(int *valor);
int ObtenerEnteroMetodo2(int *valor);
int main(int argc, char* argv[])
{
int valor;
switch(ObtenerEnteroMetodo2(&valor)){
case 0:
std::cout << "El valor resultante es: " << valor;
break;
case 1:
std::cout << "Huvo Overflow" << std::endl;
break;
case 2:
std::cout << "Formato invalido para un entero" << std::endl;
break;
}
return 0;
}
//---------------------------------------------------------------------------
bool ObtenerEnteroMetodo1(int *valor)
{
bool error=false;
std::cout<<"Introduce un valor entero: ";
std::cin >> *valor;
//Metodo 1 para comprobar overflow de entero al obtenerlo con cin
//Este metodo no discrimina entre el fallo, o sea, si meto una cadena
//que no puede convertir en un numero dará fallo pero no podré saber
//que fallo dio
if(std::cin.fail()){
error=true;
}
return !error;
}
//---------------------------------------------------------------------------
int ObtenerEnteroMetodo2(int *valor)
{
//Metodo 2 para comprobar overflow de entero al obtenerlo con cin
//Creo que es el mas completo
string cadena;
int valorbackup;
int error=0,negativo=false;
*valor=0;
std::cout<<"Introduce un valor entero: ";
std::cin >> cadena;
for(int i=0; i < cadena.length();i++){
if(cadena[i] >='0' && cadena[i] <='9'){
valorbackup=*valor;
*valor*=10;
*valor += (cadena[i]-'0');
if(valorbackup != *valor/10){
error=1; //Huvo overflow
break;
}
}else if(i==0 && cadena[i] =='-'){
negativo=true;
}else{
error=2; //Cadena con formato invalido
break;
}
}
if(negativo)
*valor *= -1; //Convertir el numero en negativo
return error;
}
Me gusta como ha quedado el metodo 2 pero si veis como mejorarlo soy todo oidos jejeje.