[C con Clase] para que strcpy

Salvador Pozo salvador en conclase.net
Vie Jun 8 18:53:48 CEST 2007


El pasado 2007-06-08 15:17:10, rodolfo escribió:
 
r> Hola a todos.-
r> Gracias Steven, como siempre aclarado el punto, aunque en esta ocasion creo 
r> que
r> mi pregunta no estuvo completa, me falto esto.
r> Estoy revisando un programa que sobrecarga operadores para una
r> clase llamada Cadena.
r> Programa:
r> int main()
r> {
r>    Cadena c1( "feliz" );
r> nota mia: esto invoca al constructor de conversion
r>           porque "feliz" es una constante literal (creo)
r>           y debe ser convertida a tipo Cadena
r> Programa:
r> // el constructor de conversión convierte un char * en una Cadena
r> Cadena::Cadena( const char *c )
r>    : longitud( ( c != 0 ) ? strlen( c ) : 0 )
r> {
r>    cout << "Constructor de conversion: " << c << '\n';
r>    estableceCadena( c );       // llama a la función de utilidad
r> } // fin del constructor de conversión Cadena
r> // función de utilidad invocada por el constructor
r> void Cadena::estableceCadena( const char *cadena2 )
r> {
r>    ptrC = new char[longitud + 1]; // asigna memoria
r>    if ( cadena2 != 0 )               // si cadena2 no es un apuntador nulo
r>       strcpy( ptrC, cadena2 );    // copia la literal a un objeto
r>    else                                   // si no
r>       ptrC[ 0 ] = '\0';               // cadena vacía
r> } // fin de la función estableceCadena
r> nota mia: ¿ porque es necesario strcpy( ptrC, cadena2 )?
r>           porque no simplemente copio el puntero de cadena2 en ptrC
r>           hacieno ptrC = cadena2;
r>           para que ptrC apunte a la direccion de "feliz", que no esta usando
r>           nadie, ¿o si?.
r>           ¿ para que necesito crear otra cadena en otro lugar ?
r>           ¿ que hay de malo con el lugar que ocupa "feliz" ?

Lo cierto es que podrías usar el puntero, pero aunque esto no sería un problema en este caso concreto, podría crearlos en otras situaciones.

Por ejemplo, supongamos que tenemos que crear muchas cadenas, para lo que usamos  un mismo puntero:

char cad[64];
Cadena cadena[100];

for(int i=0; i < 100; i++) {
   sprintf(cad, "texto %d", i+1);
   cadena[i](cad);
}

En este caso estamos creando un array de 100 Cadenas, para lo que usamos una cadena estándar C, (array de chars terminada en cero), pero siempre la misma.

Si en lugar de reservar un espacio para cada objeto nos limitamos a copiar la dirección del puntero, al final todas las cadenas del array tendrían el mismo valor: "texto 100".

Uno de los objetivos de encapsular las cadenas en una clase es gestionar la memoria de forma automática. Esto nos permite, entre otras cosas, aplicar operadores a las cadenas, como + para concatenar, sin preocuparnos de manejar la memoria de forma directa.

Del modo que propones, lo que encasulamos no es una cadena, sino un puntero. Esto se puede hacer (no está prohibido), pero probablemente no es lo que queremos hacer con una clase a la que hemos llamado "Cadena".

No sé si me explico. :-)

Hasta pronto.

r> Disculpen la insolencia de las preguntas, pero como dicen por ahi,
r> "la ignorancia es audaz" je, je.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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