[C con Clase] Como paso un string por parametro
Steven Davidson
srd4121 en njit.edu
Sab Mayo 26 06:12:19 CEST 2012
Hola Aníbal,
On 5/25/2012 7:16 PM, anibal elprofe wrote:
> Hola mi nombre es Anibal y tengo un problema con un programa ya que
> no puedo guardar en una clase el valor que paso . Bueno te paso el
> pequeño programa. Saludos
>
Ante todo, bienvenido a la lista y a este mundillo de la programación en
C++.
Veamos el código fuente.
>
> #include <iostream>
> #include <string>
>
> class Mensajes
> {
> private:
> char palabras[20];
>
> public:
> void modificarPalabras(char *word);
Aconsejo que indiques 'const char *', ya que no tienes intención de
modificar el contenido de 'word', en esta función. Además, así puedes
aceptar cadenas literales.
> char mostrarPalabras();
Esto seguramente no es lo que quieres, ya que estás retornando un solo
'char', cuando te interesa retornar una cadena de caracteres. Como no
quieres dar acceso al dato privado, 'palabras', deberías retornar una
cadena como una constante. Esto es,
const char * Mensajes :: mostrarPalabras() const;
También fíjate en 'const' al final de la función miembro, para indicar
que esta función no tiene intención de modificar "este objeto".
> };
>
> char Mensajes :: mostrarPalabras()
> { return palabras[20] ;
> }
Aquí estarías accediendo al carácter de índice 20, el cual no pertenece
a esta cadena, y por tanto, estaríamos accediendo a memoria que no es
nuestra, pudiendo provocar algún error durante la ejecución del programa.
Como dije antes, lo más seguro esque quieras retornar la cadena en sí.
Esto es,
const char * Mensajes :: mostrarPalabras() const
{
return palabras;
}
> void Mensajes :: modificarPalabras( char word)
> { palabras[20] = word[20];
> }
>
Como he dicho antes, estás accediendo al carácter de índice 20, que es
un error. Si quieres copiar el contenido de la cadena en 'word', al de
'palabras', entonces, tienes que hacerlo explícitamente. Es decir,
tienes que copiar carácter a carácter de 'word' a 'palabras'.
Afortunadamente, tenemos la función estándar 'strcpy()' declarada en
<cstring>. Esto es,
void Mensajes :: modificarPalabras( const char *word )
{
strcpy( palabras, word );
}
Oincluso, 'strncpy()', para asegurarnos de que no rebasaremos la
cantidad máxima de 'palabras'; esto es,
strncpy( palabras, word, 20 );
>
> int main()
> {
>
> char pal[20];
> class Mensajes reporte;
Esto es incorrecto. No debes escribir 'class' para indicar el tipo
'Mensajes'. Simplemente usa el nombre del tipo que has definido,
Mensajes reporte;
>
> std::cout<< "Ingrese un texto: ";
> std::cin >> pal;
> reporte.ModificarPalabras(pal);
> std::cout << reporte.MostrarPalabras();
>
> getchar(); getchar();
Estas funciones estándares pertenecen a <cstdio>. Como incluyes
<iostream>, sugiero usar esta funcionalidad, cuya función homóloga es
'get()' de la clase 'istream'. Esto es,
std::cin.get();
std::cin.get();
> return 0;
> }
>
Como incluyes <string>, deberías usar la clase 'string' y así no tienes
que estar gestionando el funcionamiento de las cadenas como arrays. Por
otro lado, si quieres aprender a usar el lenguaje, entonces practica
usando arrays y cadenas de caracteres.
Espero que esto te aclare las dudas.
Steven
Más información sobre la lista de distribución Cconclase