[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