CONTENEDORES STL vector

Iniciado por chicainge, 7 Junio 2014, 01:43 AM

0 Miembros y 1 Visitante están viendo este tema.

chicainge

Hola tengo una duda sobre como acceder a el nombre de esta estructura:
       
        typedef struct habitacion{
         string nombre;
        };
        typedef vector<habitacion> habitaciones;
        vector<habitaciones> planta;

Esta declarado dentro de una clase privada, pero al intentar incluir un nombre..
planta [hab][pla]=nombre;
me sale un error, como puedo entonces acceder a nombre?

ivancea96

Código (cpp) [Seleccionar]
planta[hab][pla].nombre

Por cierto, en C++, se pone simplemente:

Código (cpp) [Seleccionar]
struct habitacion{
   string nombre;
};

vector< vector<habitacion> > plantas;

chicainge

Gracias pero el programa me sigue dejando de funcionar, mira ;
este es el main:
#include <iostream>
#include <string>
#include <cctype>
#include "hotel.hpp"
using namespace std;
using namespace umalcc;

void leer_num(unsigned& num, const string& msj)
{
    cout << msj ;
    cin >> num;
}
void leer_str(string& str, const string& msj)
{
    cout << msj ;
    cin >> str;
}
void leer_cliente(string& nombre)
{
    leer_str(nombre, "Introduzca el nombre del cliente: ");
}
void check_ok(bool ok, const string& msj)
{
    if (ok) {
        cout << "Operacion Correcta. [" << msj << "]" << endl;
    } else {
        cout << "Operacion Erronea. [" << msj << "]" << endl;
    }
}
char menu()
{
    char op;
    cout << "X: Fin" << endl;
    cout << "A: Mostrar Datos Hotel" << endl;
    cout << "B: Alojar Nuevo Cliente" << endl;
    cout << "C: Desalojar Cliente" << endl;
    do {
        cout << endl << "    Opcion: ";
        cin >> op;
        op = char(toupper(op));
    } while (!((op == 'X')||((op >= 'A')&&(op <= 'E'))));
    cout << endl;
    return op;
}
int main()
{
    unsigned n_plantas, n_habs;
leer_num(n_plantas, "Introduzca el numero de plantas del hotel: ");
leer_num(n_habs, "Introduzca el numero de habitaciones por planta: ");
Hotel hotel(n_plantas, n_habs);
    bool ok;
    string nombre, msj;
    unsigned planta, n_hab;
    char op = ' ';
    do {
op = menu();
switch(op) {
case 'A':
hotel.Mostrar();
break;
case 'B':
leer_cliente(nombre);
hotel.Alojar(nombre, planta, n_hab, ok);
check_ok(ok, "Alojar");
if (ok) {
cout << " Alojar: " << nombre
<< " Planta: " << planta
<< " Hab: " << n_hab << endl;
}
break;
case 'C':
leer_str(nombre, "Introduzca el nombre del cliente: ");
hotel.Desalojar(nombre, ok);
check_ok(ok, "Desalojar");
break;
}
    } while (op != 'X');
}

este el hpp:
#ifndef hotel_hpp__
#define hotel_hpp__ 1
#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
namespace umalcc {
//--------------------------------------------------------------------------

class Hotel {
public:
Hotel(unsigned n_plantas, unsigned n_habs);
void Mostrar() const;
void Alojar(const std::string& nombre,
unsigned& plant, unsigned& n_hab, bool& ok);
void Desalojar(const std::string& nombre, bool& ok);
private:
//- tipos ----------------------
typedef struct habitacion{
      string nombre;
        };
        vector<  vector<habitacion>  > planta;
unsigned MAXPLANTA,MAXHABITACIONES;
};
}
#endif


y este el cpp del hpp:

#include <iostream>
#include "hotel.hpp"
#include <string>
#include <queue>
#include <vector>

using namespace std;
using namespace umalcc;

Hotel::Hotel(unsigned n_plantas, unsigned n_habs){
    MAXPLANTA=n_plantas;
    MAXHABITACIONES = n_habs;
    planta[MAXHABITACIONES][MAXPLANTA];
}
void Hotel::Mostrar() const{
    for(unsigned j=0; j<=planta.size();j++){
    cout<<"PLANTA "<< j <<" : "<<endl;
    for(unsigned i=0;i<MAXHABITACIONES;i++){
        cout<<"HABITACION "<< i <<" : "<<planta[i][0].nombre<<endl;
    }
    }
}
void Hotel::Alojar(const std::string& nombre, unsigned& plant, unsigned& n_hab, bool& ok){
    ok=false;

    unsigned j,n_p=planta.size();
    while(ok!=true || j!=(n_p+1)){
    for(j=0; j<=n_p;j++){
        for(unsigned i=0;i<MAXHABITACIONES;i++){
            if(planta[i][j].nombre!="") {
                    plant=j;
                    n_hab=i;
                    planta[i][j].nombre=nombre;
                    ok=true;
               }
            }
    }
    j++;
    }
}
void Hotel::Desalojar(const std::string& nombre, bool& ok){
    ok=false;
    unsigned j,n_p;
    n_p=planta.size();
    while(ok!=true || j<=(n_p+1)){
    for(j=0; j<=planta.size();j++){
        for(unsigned i=0;i<MAXHABITACIONES;i++){
            if(planta[i][j].nombre==nombre){
               planta[i][j].nombre="";
               ok=true;
            }
        }
    }
    j++;
    }
}

eferion

Código (cpp) [Seleccionar]

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.

Código (cpp) [Seleccionar]

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":

Código (cpp) [Seleccionar]

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":

Código (cpp) [Seleccionar]

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:

Código (cpp) [Seleccionar]

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.

chicainge