typedef struct habitacion{
string nombre;
};
La palabra reservada "typedef" sobra porque en esa línea, sencillamente no hace nada.
"typedef" sirve para definir alias dentro del código con el fin de conseguir un código más legible. En tu caso no estás definiendo ningún alias, por lo que te puedes ahorrar esa palabra reservada.
vector< vector<habitacion> > planta;
unsigned MAXPLANTA,MAXHABITACIONES;
la clase "vector" dispone de un método llamado "size()" que devuelve el número de elementos que contiene dicho vector. Si en el constructor de la clase "Hotel" creas tantos elementos en "planta" como plantas tenga el hotel y tantas habitaciones en cada planta como corresponda, te puedes ahorrar el uso de las variables "MAXPLANTA" y "MAXHABITACIONES":
Hotel::Hotel(unsigned n_plantas, unsigned n_habs)
{
for ( int i = 0; i < n_plantas; i++ )
{
// "Creamos" una planta con "n_habs" habitaciones
planta.push_back( std::vector< habitacion >( n_habs ) );
}
}
Entre otras cosas, la siguiente línea que tienes en el constructor simplemente no va a funcionar porque no estás definiendo un array en memoria, sino que estás creando y configurando una clase de tipo "vector":
Hotel::Hotel(unsigned n_plantas, unsigned n_habs){
// ...
planta[MAXHABITACIONES][MAXPLANTA];
}
Con esto, el código del método "Alojar" se puede simplificar un poco... eso sin contar que el código que tienes actualmente tiene algún error:
void Hotel::Alojar(const std::string& nombre, unsigned& plant, unsigned& n_hab, bool& ok)
{
ok=false;
for ( plant = 0; plant < planta.size( ) && !ok; plant++ )
{
for ( n_hab = 0; n_hab < planta[ plant ].size( ) && !ok; n_hab++ )
{
if ( planta[ plant ][ n_hab ].nombre.empty( ) )
{
planta[ plant][ n_hab ].nombre = nombre;
ok = true;
}
}
}
// Si no hay habitaciones libres, indicamos la posicion de una habitacion no valida (por si acaso)
if ( !ok )
{
plant = -1;
n_hab = -1;
}
}
La función "Desalojar" tiene los mismos errores que "Alojar", si aplicas lo aprendido en "Alojar" verás que no es demasiado difícil corregir ese código.