[C con Clase] Ayuda Sobre Clases

Steven Richard Davidson stevenrichard.davidson en gmail.com
Jue Ago 30 23:28:33 CEST 2007


Hola Cristhian,

On 8/30/07, CRISTHIAN ANGARITA <thiancriss85 en hotmail.com> wrote:
>
> hola a todos,
>
> bueno lo que pasa es que estoy aprendiendo un poco sobre clases en C++ y
> todo va bien hasta que intento que el usuario sea el que ingrese los datos.
> tengo por lo menos este programa y quiero que el usuario ingrese los datos
> pero no he podido, no se si algion me pueda colaborar con una explicacion
> sobre como hacerlo o si saben sobre un tutorial sobre eso.
>

Típicamente, uno consigue toda la información necesaria del usuario,
para luego pasarla al objeto a través de alguna función miembro
especializada en la tarea de asignar valores a los datos miembros de
dicho objeto. Por ejemplo,

class perros
{
public:
  // Funciones para Conseguir y Asignar valores a los datos miembros
  const char * raza() const  { return this->raza; }
  void raza( const char *szRaza )  { strcpy( this->raza, szRaza ); }

  int altura() const  { return this->altura; }
  void altura( int nAltura )  { this->altura = nAltura; }
...
};

Para usar estas funciones miembros, sencillamente las invocamos cuando
tengamos la información que queremos pasar al objeto. Por ejemplo,

int main()
{
  perros can( "pastor alemán", 100, 35, "marrón" );

  char szRaza[64];
  cout << "Raza: ";
  cin >> szRaza;
  can.raza( szRaza );

  int nAltura;
  cout << "Altura: ";
  cin >> nAltura;
  can.altura( nAltura );
  ...
}

Otra implementación es usar referencias. Por ejemplo,

class perros
{
public:
  const char * raza() const  { return this->raza; }
  char * raza()  { return this->raza; }

  int altura() const  { return this->altura; }
  int & altura()  { return this->altura; }
...
};

Con esto, podemos usar las funciones miembros de esta manera:

int main()
{
  perros can( "pastor belga", 80, 30, "negro" );

  cout << "Raza: ";
  cin >> can.raza();   // invoca: char * perros::raza()

  cout << "Altura: ";
  cin >> can.altura(); // invoca: int & perros::altura()
  ...

  cout << "Raza: " << can.raza() << endl;    // invoca: const char *
perros::raza() const
  cout << "Altura: " << can.altura() << endl; // invoca: int
perros::altura() const
  ...
}


Veamos el código fuente que nos envías.

>
> #include <iostream.h>
> #include <string.h>

Los nombres de los ficheros de cabecera estándares fueron cambiados
desde la última revisión del estándar de C++. En este caso, deberías
escribir:

#include <iostream>
#include <cstring>

using namespace std;

Si tienes un compilador "antiguo", entonces es posible que tu
compilador se queje si usas los "nuevos" nombres.

> class perros{
> public:
>  perros(char *raza,int altura,int peso,char *color);

Como no tienes intención de modificar los caracteres apuntados por
estos punteros, sugiero indicar 'const'. Esto es,

perros( const char *raza, int altura, int peso, const char *color );

También sugiero cambiar los nombres de los parámetros. Nos podemos
meter en problemas si coincidimos estos nombres con los de los datos
miembros. Por ejemplo,

perros( const char *szRaza, int nAltura, int nPeso, const char *szColor );

>   void mostrar_raza(void);

En C++, no es necesario indicar 'void' para el tipo de la lista de
parámetros. Simplemente, no escribas nada entr los paréntesis. Esto
sería,

void mostrar_raza();

> private:
>  char raza[64];
>  int altura;
>      int peso;
>  char color[64];
> };

[CORTE]

> perros::perros(char *raza,int altura,int peso,char *color)
> {
>  strcpy(perros::raza, raza);
>     perros::altura=altura;
>     perros::peso=peso;
>  strcpy(perros::color, color);

Aunque puedes usar el ámbito para los datos miembros, sugiero usar el
puntero 'this'. Esto sería,

strcpy( this->raza, raza );
this->altura = altura;
this->peso = peso;
strcpy( this->color, color );

De todas maneras, sugiero cambiar los nombres de los parámetros para
no tener problemas.


[CORTE]

> void main(void)

Bajo C++, la función 'main()' debe retornar un número entero. Por lo
tanto, el prototipo de 'main()' es:

int main()

> {
>  perros_con_manchas feliz("Dalmata",24,60,"blanco", "negras o cafes");
>  perros_sin_manchas golfo("Perdiguero labrador",24,65,"negro o amarillo");
>  feliz.mostrar_raza();
>  feliz.informacion_manchas();
>  golfo.mostrar_raza();

Por convenio, se retorna el valor 0 (cero) para indicar que la
ejecución del programa ha terminado con éxito.


Espero que todo esto te aclare las dudas.

Steven




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