Ver Mensaje Individual
  #9 (permalink)  
Antiguo 17/10/2014, 05:22
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Cómo fijar un dato de una estructura a la hora de introducirlo?

Cita:
Iniciado por dehm Ver Mensaje
Hola eferion:
Gracias por la respuesta. Se acerca a lo que yo quería simular.
El caso es que he hecho un planteamiento, que aunque funciona, no me gusta demasiado. Se trata de crear una estructura para tratar las respuestas a introducir.
A favor:
1.-Que funciona (o eso parece)
En contra:
1.-Demasiado farragoso
2.-Estas estructuras han de estar íntimamente ligadas a la estructura a la que sirven de soporte, y si ésta cambia hay que ir cambiando la estructuras que recogen las respuestas. Esto puede parecer trivial en este ejemplo, pero si tuviéramos algo más serio o más grande creo que no sería muy viable.
Creo que para el caso es más factible y limpio hacer uso un "gestor" que controle la generación de nuevos elementos:

Código C++:
Ver original
  1. class GestorPoligonos
  2. {
  3.   public:
  4.  
  5.     GestorPoligonos( )
  6.       : ladosBloqueados( false ),
  7.         colorBloqueado( false )
  8.     {
  9.     }
  10.  
  11.     void BloquearLados( int n )
  12.     {
  13.       ladosBloqueados = true;
  14.       numLados = n;
  15.     }
  16.  
  17.     void BloquearColor( const std::string& c )
  18.     {
  19.       colorBloqueado = true;
  20.       color = c;
  21.     }
  22.  
  23.     void DesbloquearLados( )
  24.     {
  25.       ladosBloqueados = false;
  26.     }
  27.  
  28.     void DesbloquearColor( )
  29.     {
  30.       colorBloqueado = false;
  31.     }
  32.  
  33.     Poligono NuevoPoligono( )
  34.     {
  35.       Poligono poli( numLados, color);
  36.  
  37.       if ( !ladosBloqueados )
  38.       {
  39.         std::cout << "Introduce nº de lados: ";
  40.         std::cin >> poli.n_lados;
  41.       }
  42.  
  43.       if ( !colorBloqueado )
  44.       {
  45.         std::cout << "Introduce color: ";
  46.         std::cin >> poli.color;
  47.       }
  48.  
  49.       return poli;
  50.     }
  51.  
  52.   private:
  53.  
  54.     bool ladosBloqueados;
  55.     bool colorBloqueado;
  56.  
  57.     int numLados;
  58.     std::string color;
  59. };

Con esto el main queda más limpio y despejado:

Código C++:
Ver original
  1. int main()
  2. {
  3.   std::list< Poligono > listapoligonos;
  4.   GestorPoligonos gestor;
  5.   char respuesta='d';
  6.  
  7.   do
  8.   {
  9.     if ( respuesta=='d' || respuesta=='D' )
  10.     {
  11.       std::cout << "(1) Fijar Nº de lados" << std::endl
  12.                 << "(2) Fijar Color" << std::endl
  13.                 << "(3) Desbloq. nº lados" << std::endl
  14.                 << "(4) Desbloq. color" << std::endl
  15.                 << "(5) Desbloq. ambos" << std::endl
  16.                 << "(ENTER) para seguir" << std::endl;
  17.  
  18.       int opcion;
  19.       std::cin >> opcion;
  20.       switch ( opcion )
  21.       {
  22.         case 1:
  23.         {
  24.           int n;
  25.           std::cout << "Numero lados: ";
  26.           std::cin >> n;
  27.           gestor.BloquearLados( n );
  28.           break;
  29.         }
  30.  
  31.         case 2:
  32.         {
  33.           std::string color;
  34.           std::cout << "Color: ";
  35.           std::cin >> color;
  36.           gestor.BloquearColor( color );
  37.           break;
  38.         }
  39.  
  40.         case 3:
  41.         {
  42.           gestor.DesbloquearLados( );
  43.           break;
  44.         }
  45.  
  46.         case 4:
  47.         {
  48.           gestor.DesbloquearColor( );
  49.           break;
  50.         }
  51.  
  52.         case 5:
  53.         {
  54.           gestor.DesbloquearLados( );
  55.           gestor.DesbloquearColor( );
  56.           break;
  57.         }
  58.       }
  59.     }
  60.     Poligono p = gestor.NuevoPoligono( );
  61.     listapoligonos.push_back( p );
  62.  
  63.     std::cout << "¿Quieres introducir otro poligono?" << std::endl;
  64.     std::cout << "(S) para introducir (D) para fijar algun valor (N) Salir" << std::endl;
  65.  
  66.     std::cin >> respuesta;
  67.     std::cin.get( );
  68.   }
  69.   while (respuesta=='s' || respuesta=='S' || respuesta=='d' || respuesta=='D');
  70.  
  71.   std::cout<< "Los poligonos son: " << std::endl;
  72.   std::for_each( listapoligonos.begin( ), listapoligonos.end( ),
  73.                  []( const Poligono& p )
  74.                  { std::cout << p.n_lados << " - " << p.color << std::endl; } );
  75. }

PD.: me he tomado la libertad de cambiar "char[20]" por "std::string" en el poligono para que el diseño quede lo más limpio posible.