[C con Clase] bloqueo

Steven Davidson steven en conclase.net
Jue Mayo 31 07:50:50 CEST 2007


Hola Rodolfo,

El pasado 2007-05-31 05:05:07, rodolfo escribió:

r> /* Hola a Todos.-
r> Como siempre quiero comenzar agradeciendo a los que contestaron mi último 
r> correo,
r> en este caso fue Steven, como siempre tan didactico, punto aclarado, 
r> gracias.

De nada; para eso estamos.

r> Pero ahora tengo un bloqueo casi existencial con los punteros y las 
r> referencias
r> a punteros y todo eso. Ojalá me pueda hacer entender.

Primeramente, me temo que no nos has dado el mensaje de error que te lanzaba el compilador ni el código erróneo que escribiste. Por lo tanto, no sé cuál ha sido tu problema o error exactamente. En segundo lugar, el hecho de que un array sea tratado como un puntero constante no tiene nada que ver con que sea o no un 'lvalue'. Al fin y al cabo, no vamos a modificar el valor de tal dirección de memoria, sino los valores a partir de esta dirección. La constancia está en la dirección de memoria y no en los 'char'. Simplemente haz lo siguiente:

class Palabra
{
public:
  ...
  char * ObtieneX()  { return x; }

private:
  char x[5];
};


Ahora bien, seguramente el problema que estás teniendo provenga de la forma en que manipulabas la cadena. Si haces lo siguiente, tendremos problemas:

void noMiembro( Palabra &p, const char val[5] )
{
  p.ObtieneX() = val;
}

Recuerda que aquí estaríamos tratando direcciones de memoria; y nada más. Lo que queremos hacer es copiar el contenido guardado en estas direcciones de memoria. En este caso, sugiero usar la función estándar 'strcpy()' o incluso 'strncpy()'. Por ejemplo,

void noMiembro( Palabra &p, const char val[5] )
{
  strncpy( p.ObtieneX(), val, 5 );
}

Con esto, copiamos los caracteres de una cadena a la otra.

r>    // 1. constructor
r>    Palabra()
r>    // { x[1] = 'M'; x[2] = 'a'; x[3] = 'm'; x[4] = 'a'; x[5] = '0'; } // 

Por cierto, esto no es correcto. Tienes dos errores lógicos:

1. Los índices de los arrays SIEMPRE empiezan por 0 (cero).
2. Sugiero vehementemente terminar las cadenas de caracteres en el carácter nulo. Creo que esto era lo que querías hacer, pero me temo que simplemente has asignado el carácter '0'. El carácter nulo es '\0' o sencillamente 0 (cero).

Al final, obtendremos lo siguiente:

Palabra()
{ x[0] = 'M'; x[1] = 'a'; x[2] = 'm'; x[3] = 'a'; x[4] = '\0'; }

O incluso:  x[4] = 0;


Espero haber aclarado las dudas.

Steven


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