gratiszona

OBJETOS ENCADENADOS EN C

Un objeto con un puntero a otro objeto: Objetos encadenados.
Añadamos a la clase Caja como atributo privado un puntero a otro objeto de la misma clase:

#include <iostream.h>
class Caja {
double longitud, anchura, altura;
Caja *otraCaja;
public:
Caja(double dim1, double dim2, double dim3); //Constructor
double volumen(void);
void point_at_next(Caja *where_to_point);
Caja *get_next(void);
};
Caja::Caja(double dim1, double dim2, double dim3) { //implementacion del constructor
longitud = dim1;
anchura = dim2;
altura = dim3;
otraCaja = NULL;
}
double Caja::volumen(void) {
return (longitud * anchura * altura);
}
void Caja::point_at_next(Caja *where_to_point) {
otraCaja = where_to_point;
}
Caja *Caja::get_next(void) { // Este metodo devuelve la caja a la que apunta la caja actual
return otraCaja;
}
main() {
Caja pequeña(5, 4, 10), mediana (10, 6, 20), grande(20, 10, 30);
Caja *CajaPointer;
cout << 'El volumen de la Caja pequeña es ' << pequeña.volumen() << '\n';
cout << 'El volumen de la Caja mediana es ' << mediana.volumen() << '\n';
cout << 'El volumen de la Caja grande es' << grande.volumen() << '\n';
pequeña.point_at_next(&mediana);
mediana.point_at_next(&grande);
CajaPointer = &pequeña;
CajaPointer = CajaPointer->get_next();
cout << 'La Caja apuntada tiene volumen = ' << CajaPointer->volumen() << '\n';
}
El resultado de la ejecucion sera:
El volumen de la Caja pequeña es 200
El volumen de la Caja mediana es 1200
El volumen de la Caja grande es 6000
La Caja apuntada tiene volumen = 1200
En este programa:
· Hemos definido, en la parte privada de la clase Caja, un puntero a un objeto de la misma Clase. Esta es la estructura utilizada para la construccion de listas encadenadas.
· El constructor asigna el valor NULL al puntero. Esta es una buena idea, inicializar siempre los punteros. Haciendo esta asignacion en el constructor, se garantiza que cada objeto de esta clase tendra automaticamente su puntero inicializado.
· Hemos añadido dos funciones: point_at_next y get_next. Esta ultima devuelve un puntero a un objeto de la clase Caja.
· En el programa principal declaramos un puntero a un objeto del tipo Caja, CajaPointer.
· Hacemos que el puntero embebido en la caja pequeña apunte a la caja mediana y que el puntero embebido en la caja mediana apunte a la caja grande. Hemos generado una lista encadenada con tres elementos.
· A continuacion hacemos que el puntero CajaPointer apunte a la caja pequeña y lo utilizamos para referenciar a la caja pequeña y actualizarlo al valor contenido en la caja pequeña que es la direccion de la caja mediana. Hemos pasado, pues, de un elemento de la lista al siguiente llamando a una funcion de uno de los objetos.

Un objeto embebido en otro objeto. El puntero this. En C++ se define this dentro de un objeto como un puntero al objeto en que esta contenido. Se declara implicitamente como:
class_name *this;
y se inicializa para apuntar al objeto para el cual se llama a la funcion miembro. Este puntero es muy util cuando se trabaja con punteros y especialmente en listas encadenadas cuando se necesita referenciar un puntero al objeto que se esta insertando en la lista. La palabra this esta disponible para este proposito y puede ser utilizada en cualquier objeto. Realmente la forma apropiada de referenciar a cualquier variable en una lista es a traves del uso del puntero predefinido this, escribiendo this -> nombre_variable, pero el compilador supone que se esta usando y podemos omitir el puntero.
Funciones amigas. Una funcion fuera de una clase puede definirse como funcion amiga por la clase que le da libre acceso a los miembros privados de la clase. Hay casos en que esto ayuda a hacer mas legible un programa y permite el acceso controlado a los datos.
Una funcion aislada puede ser declarada como amiga, asi como miembro de otras clases, e incluso se le puede dar el status de amiga a clases enteras, si es necesario.
No pueden ser funciones amigas los constructores ni los destructores.
Anterior: punteros a clases
Siguiente: sobrecarga de operadores

Tal vez te interese sobre lenguaje c: