C ++ Comprobando un entero.

Nuevo en C ++. Tener problemas correctamente en bucle mientras se maneja errores. Estoy intentando comprobar si la entrada del usuario es un número entero y es positiva.

do{
    cout << "Please enter an integer.";
    cin >> n;

    if (cin.good())
    {
        if (n < 0) {cout << "Negative.";}
        else {cout << "Positive.";}
    }
    else
    {
        cout << "Not an integer.";
        cin.clear();
        cin.ignore();
    }
}while (!cin.good() || n < 0);

cout << "\ndone.";

Cuando se ingresa un número no entero, el bucle se rompe. Siento que estoy malinterpretando el uso inherente decin.clear() ycin.ignore() y el estado decin durante este bucle. Si quito elcin.ignore(), el bucle se vuelve infinito. ¿Por qué es esto? ¿Qué puedo hacer para convertir esto en un bucle que funcione con elegancia? Gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta