[C con Clase] Incluir una estructura privada dentro de una clase.

Steven Davidson srd4121 en njit.edu
Lun Mayo 25 20:07:47 CEST 2009


Hola Augusto,

Augusto wrote:

> Muy buenas!
> Necesito una manito con el tema de clases y estructuras.
> Necesito hacer una clase que almacene basicamente:
> 
> include<iostream>
> using namespace std;
> 
> class una{ 
> private:
>           struct uno{int mu; float su;};
>           struct dos{int md; float sd;}; 
>           char Nombre[100];  
> 
>  public: 
> //aca irian un par de variables y varias funciones...
> void funcion(){};
>          }; //fin class
> int main()
> {
> // desde main se llaman a las funciones de la clase "una".
> // la idea es instanciar 5 objetos "una" de las cuales cada una contiene:
> // un Nombre.
> // y
> // dos estructuras las cuales van almacenando datos que son ingresados por teclado.
> }
> 
> El problema esta en que no se como hacer para manejarme con las
> estructuras dentro de las funciones public o desde main.
> Supongo que debo manejarme con puntero, pero como los declaro?,
> donde?, en el contructor o en la funcion?
> La verdad que busque info en muchos libros y paginas, pero no
> encontre nada.

En primer lugar, debes declarar las variables de las estructuras en la 
clase 'una' para que sean miembros de tal clase. Por ahora, sólo has 
declarado 'Nombre' como el único dato miembro de 'una'. Si quieres más 
datos miembro de la clase 'una', entonces necesitas declararlos. Según 
la metodología de la POO, deberíamos definir los datos miembro en 
privado. Por lo tanto, escribimos,

clase una
{
private:
   char Nombre[100];
   uno unObj;
   dos dosObj;

public:
   ...
};

Si necesitas controlar la información de cada estructura directamente a 
través de un objeto de la clase 'una', entonces sólo necesitas proveer 
las funciones públicas de 'una' para tal control. Por ejemplo,

clase una
{
   ...
public:
   una();
   void asignarMu( int m )  { unObj.mu = m; }
   void asignarSu( float s )  { unObj.su = s; }
   ...
   int obtenerMu() const  { return unObj.mu; }
   float obtenerSu() const  { return unObj.su; }
   ...
};

De esta forma, nadie sabe que tienes dos estructuras como miembros en la 
clase 'una'.

Si no quieres esconder tanto, entonces puedes crear funciones miembro 
para enviar las estructuras miembro de la clase 'una'. Por ejemplo,

clase una
{
   ...
public:
   una();
   void asignarUno( const uno &obj )  { unObj = obj; }
   void asignarDos( const dos &obj )  { dosObj = obj; }
   ...
   uno obtenerUno() const  { return unObj; }
   dos obtenerDos() const  { return dosObj; }
   ...
};

Esto significa que la clase 'una' ofrece ciertos detalles internos de su 
clase. En este caso, cualquier código externo a esta clase puede 
manipular las dos estructuras. Sin embargo, esto también significa que 
debes dar a conocer la definición de tales estructuras 'uno' y 'dos'. 
Para esto, deberás definir las estructuras públicamente. Esto es,

class una
{
public:
   struct uno { int mu; float su; };
   struct dos { int md; float sd; };

private:
   uno unObj;
   dos dosObj;
   char Nombre[100];

public:
   ...
};

Ahora, por ejemplo, 'main()' puede acceder a cada tipo de la clase 'una' 
directamente, pero no puede acceder a cada variable de ambas 
estructuras. Por ejemplo,

int main()
{
   una::uno o1 = { 10, 4.5 };
   una::dos o2 = { -1, -.3 };

   una obj;
   obj.asignarUno( o1 );
   obj.asignarDos( o2 );

   cout << obj.obtenerUno().mu << ',' << obj.obtenerUno().su << endl;
   cout << obj.obtenerDos().md << ',' << obj.obtenerDos().sd << endl;

   return;
}

Como puedes ver, podemos acceder a cada estructura, pero sólo a través 
de las funciones miembro de la clase 'una'.


Espero haber aclarado las dudas.

Steven





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