La clase CString - Uso del CString como LPCSTR

6 - Uso del CString como LPCSTR

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Los objetos CString también pueden utilizarse como si fueran arrays de chars, concretamente del tipo LPCTSTR (puntero largo constante a cadena).

Como ya hemos visto, el operador LPCTSTR permite la conversión de un objeto CString a su puntero LPCTSTR, y cómo uno de los constructores nos permite crear un objeto CString a partir de una cadena LPCTSTR.

Además, existe un nuevo método, para acceder a al array de caracteres de un objeto CString: a través de las funciones GetBuffer() y ReleaseBuffer().
GetBuffer() nos retorna un puntero LPTSTR (puntero modificable) a la cadena interna del objeto CString. Esto nos permite consultar el contenido interno del objeto o incluso modificarlo, aunque en este caso habría que llamar a ReleaseBuffer() después de la modificación.
ReleaseBuffer() nos libera el buffer previamente reservado con GetBuffer(). Siempre hay que llamar a ReleaseBuffer() cuando hayamos terminado de manipular la cadena obtenida con GetBuffer(), y con más razón cuando esta cadena ha sido modificada.
Hasta aquí la parte fácil del asunto, pero... ¿qué pasaría si pasamos un objeto CString a la función printf?
Lo primero que se nos pasa por la cabeza es que eso no debe permitirlo el compilador... pero no es así, ya que las funciones con argumentos variables (como printf, sprintf, scanf, etc.) no hacen comprobación de tipos.
Entonces... ¿qué es lo que ocurre con el siguiente código?

CString objeto = "hola mundo";
char buffer[16];

::sprintf(buffer, "%s", objeto);

Cuando la función procese el primer algumento variable (llamado "objeto"), considerará que es un puntero a una cadena de caracteres terminada en '\0'. Y así es, ya que, como hemos visto, la implementación de la clase CString solamente tiene un atributo, y este es un puntero a una cadena de caracteres. Así que la memoria ocupada por el objeto comenzará con un puntero al contenido del propio objeto, seguido por el resto de los componentes de la clase (en nuestro caso, solo funciones miembro).
El código anterior podría ser equivalente a este otro, saltándonos la seguridad del atributo protected:

CString objeto = "hola mundo";
char buffer[16];

::sprintf(buffer, "%s", objeto.m_pchData);

Este engaño que hace la clase CString a la función sprintf, lo podremos hacer nosotros mismos, siempre y cuando definamos una clase cuyo primer atributo sea un puntero a cadena de texto, y pasemos el objeto, y no la referencia al objeto.

Como norma general, podríamos decir que cuando pasamos un objeto por parámetro, en realidad estamos pasando la dirección de memoria donde está el primer atributo de ese objeto.
[editar]

3 opiniones

sexo

creo k l sxo no solo s bsa n tenr rlaciones sino poder espresar los sentimintos de formee exotik y tod eso
Ayuda.

Como paso un cstrin a char en visual. Net.
Regular.

Es algo util este curso pero le falta, pero si me ayudo un poco

gracias.

Tutoriales relacionados con 'La clase CString'

Este curso profundiza en la implementación de la clase CString dentro del framework MFC. Se... Más »
Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de... Más »

Autor y licencia de 'La clase CString'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.