[C con Clase] problema ENUMERADOS

Steven Davidson steven en conclase.net
Mar Feb 20 03:02:47 CET 2007


Hola Tikitita,

El pasado 2007-02-20 00:41:52, tikitita escribió:

t> Eiiiiiiiiiiii ke buenooooooo ya no me salta,,, pero ahora me da error el
t> constructor :(

Veamos el código.

t> #include <iostream>
t> #include <cstdlib>
t> #include "jugadores.h"
t> using namespace std;
t> jugadores::jugadores (char *nombre){
t>     nombre=nombre;
t>     puntoscartas=0;
t> }

El problema está en que el prototipo de esta implementación es diferente al prototipo que declaraste en la definición de la clase 'jugadores'. Escribiste:

class jugadores
{
private:
  ...

public:
  jugadores();
  ...
};

El compilador te lanza un error porque la función que implementaste no concuerda con el prototipo en la clase 'jugadores'.

Si quieres que el constructor acepte una cadena de caracteres, entonces los prototipos deben concordar. Esto sería,

class jugadores
{
private:
  ...

public:
  jugadores( const char *nom );
  ...
};
...
jugadores::jugadores( const char *nom )
{
...
}

Otro error que tienes es de ambigüedad al escribir:

nombre = nombre;

El compilador no sabe cuál es cuál. Podrías reescribi lo anterior a lo siguiente:

this->nombre = nombre;

'this' es el puntero a "este objeto". Como mencionaste que sabes Ada, esto no debería sorprenderte.

De todos modos, es más fácil cambiar el nombre del parámetro, como he hecho previamente.


El otro posible error que tienes es a la hora de asignar o "copiar" la cadena a otra. Si lo que querías hacer es copiar el contenido de una cadena a otra, entonces tienes que copiar cada elemento de una cadena a la otra. Sugiero usar la función estándar 'strcpy()' declarada en <cstring>. Por ejemplo,

jugadores::jugadores( const char *nom )
{
  strcpy( nombre, nom );
  ...
}

Si quieres usar las cadenas de caracteres, sugiero consultar el capítulo 8 del curso de C++. Puedes ir directamente a: http://c.conclase.net/curso/index.php?cap=008


Por si no lo sabes, las cadenas de caracteres ("string", en inglés) no se comportan de igual manera que en otros lenguajes. Si no quieres tener mayores problemas, entonces quizá te convenga usar la clase 'string' declarada en <string>. Por ejemplo,

#include <string>

class jugadores
{
private:
  string nombre;
  ...
};
...
jugadores::jugadores( const string &nom )
{
  nombre = nom;  // Copiar 'nom' a 'nombre'
  ...
}

[CORTE]

t> unsigned int jugadores::puntoscartas (enum valor) {
t>     switch (valor) {
t> case 1: return 1;
t>     break;
t> case 2: return 2;
t>     break;
t> case 3: return 3;
t>     break;
t> case 4: return 4;
t>     break;
t> case 5: return 5;
t>     break;
t> case 6: return 6;
t>     break;
t> case 7: return 7;
t>     break;
t> case 8: return 8;
t>     break;
t> case 9: return 9;
t>     break;
t> case 10: return 10;
t>     break;
t> case j: return 10;
t>     break;
t> case q: return 10;
t>     break;
t> case k: return 10;
t>     break;
t>     }
t> }

No veo que esto sea necesario. Si te das cuenta, casi todos los "casos" son iguales que el valor a retornar. Por lo tanto, es más sencillo retornar el valor directamente sin estarlo comprobando. Por ejemplo,

unsigned int jugadores::puntoscartas( enum valor )
{
  return valor;
}

Viendo los últimos casos, tenemos que 'j', 'q', y 'k' equivalen a 10, porque es su puntuación. Por lo tanto, seguramente la implementación no es tan directa, pero no es tan compleja. Lo único que tenemos que hacer es comprobar los casos excepcionales a la regla. Por ejemplo,

return j <= valor&&valor <= k ? 10 : valor;

Por cierto, ten en cuenta que en el juego de blackjack el as puede equivaler 1 u 11. Obviamente, tendrás que cambiar un poco la lógica de ésta y posiblemente otras funciones miembros.


Sugiero consultar el curso de C++ para el funcionamiento correcto de su uso. Puedes ir a nuestra página: http://c.conclase.net/curso/index.php


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase