Cita:
Iniciado por dehm 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 originalclass GestorPoligonos
{
public:
GestorPoligonos( )
: ladosBloqueados( false ),
colorBloqueado( false )
{
}
void BloquearLados( int n )
{
ladosBloqueados = true;
numLados = n;
}
void BloquearColor( const std::string& c )
{
colorBloqueado = true;
color = c;
}
void DesbloquearLados( )
{
ladosBloqueados = false;
}
void DesbloquearColor( )
{
colorBloqueado = false;
}
Poligono NuevoPoligono( )
{
Poligono poli( numLados, color);
if ( !ladosBloqueados )
{
std::cout << "Introduce nº de lados: ";
std::cin >> poli.n_lados;
}
if ( !colorBloqueado )
{
std::cout << "Introduce color: ";
std::cin >> poli.color;
}
return poli;
}
private:
bool ladosBloqueados;
bool colorBloqueado;
int numLados;
std::string color;
};
Con esto el main queda más limpio y despejado:
Código C++:
Ver originalint main()
{
std::list< Poligono > listapoligonos;
GestorPoligonos gestor;
char respuesta='d';
do
{
if ( respuesta=='d' || respuesta=='D' )
{
std::cout << "(1) Fijar Nº de lados" << std::endl
<< "(2) Fijar Color" << std::endl
<< "(3) Desbloq. nº lados" << std::endl
<< "(4) Desbloq. color" << std::endl
<< "(5) Desbloq. ambos" << std::endl
<< "(ENTER) para seguir" << std::endl;
int opcion;
std::cin >> opcion;
switch ( opcion )
{
case 1:
{
int n;
std::cout << "Numero lados: ";
std::cin >> n;
gestor.BloquearLados( n );
break;
}
case 2:
{
std::string color;
std::cout << "Color: ";
std::cin >> color;
gestor.BloquearColor( color );
break;
}
case 3:
{
gestor.DesbloquearLados( );
break;
}
case 4:
{
gestor.DesbloquearColor( );
break;
}
case 5:
{
gestor.DesbloquearLados( );
gestor.DesbloquearColor( );
break;
}
}
}
Poligono p = gestor.NuevoPoligono( );
listapoligonos.push_back( p );
std::cout << "¿Quieres introducir otro poligono?" << std::endl;
std::cout << "(S) para introducir (D) para fijar algun valor (N) Salir" << std::endl;
std::cin >> respuesta;
std::cin.get( );
}
while (respuesta=='s' || respuesta=='S' || respuesta=='d' || respuesta=='D');
std::cout<< "Los poligonos son: " << std::endl;
std::for_each( listapoligonos.begin( ), listapoligonos.end( ),
[]( const Poligono& p )
{ std::cout << p.n_lados << " - " << p.color << std::endl; } );
}
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.