[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