gratiszona

Un objeto con un puntero interno

Modifiquemos la clase Caja para que incluya un puntero a una variable entera como atributo privado:
#include <iostream.h>
class Caja {
double longitud, anchura, altura;
int *point;
public:
Caja(double dim1, double dim2, double dim3, int valorAlmacenado);
~Caja();
double volumen(void) {return longitud * anchura * altura;} // Inline
int getValor(void) {return *point;} // Inline
};
//implementacion del constructor
Caja::Caja(double dim1, double dim2, double dim3, int valorAlmacenado) {
longitud = dim1;
anchura = dim2;
altura = dim3;
point = new int;
*point = valorAlmacenado;
}
Caja::~Caja(void) { //Destructor
delete point;
}
main() {
Caja pequeña(5, 4, 10, 1), mediana (10, 6, 20, 2), grande(20, 10, 30, 3);
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';
cout << 'El valor almacenado en la caja pequeña es ' << pequeña.getValor() << '\n';
cout << 'El valor almacenado en la caja mediana es' << mediana.get_valor() << '\n';
cout << 'El valor almacenado en la caja grande es ' << grande.get_valor() << '\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
El valor almacenado en la caja pequeña es 1
El valor almacenado en la caja mediana es 2
El valor almacenado en la caja grande es 3
· Declaramos como atributo privado de la clase point, un puntero a un entero. Pero en la declaracion no estamos asociando memoria a este puntero. Es en el constructor donde dinamicamente reservamos memoria para un entero, utilizando el operador new.
· Declaramos tres objetos, pequeña, mediana y grande, del tipo Caja. Cada uno de ellos contiene un puntero que apunta a tres localizaciones de memoria diferentes. Cada objeto tiene su propia variable dinamicamente reservada para su uso privado. ademas, en esta variable dinamicamente reservada se almacena el valor entero pasado al constructor.
· En un programa pequeño como este, no se agotara la memoria, por tanto no es necesario comprobar que existe memoria disponible. En programas largos, seria conveniente comprobar que el valor del puntero devuelto no es NULL, para asegurar que los datos estan realmente reservados.
· Hemos definido un destructor que borra con delete la memoria reservada dinamicamente con new. El destructor es llamado cuando los objetos que hemos definido (pequeña, mediana y grande) abandonan el bloque en el que han sido definidos. Si no hubiesemos definido el destructor, al salir de la funcion, quedarian en la memoria las tres variables reservadas dinamicamente sin nada apuntando a ellas. Por esta razon, el destructor se utiliza para borrar la variable a la que el puntero apunta cuando cada objeto sale de su ambito de definicion.
· En este caso particular, las variables serian automaticamente liberadas al volver al sistema operativo. Pero si se tratara de una funcion que llama a otra funcion, estariamos llenando la memoria.
· Recordemos que si hubiesemos reservado memoria para mas de un entero, por ejemplo:
p = new int [4];
en el destructor la liberariamos de la siguiente forma:
delete [] p;
· Mencionemos de nuevo que las funciones declaradas inline deben ser utilizadas cuando la rapidez es lo mas importante en el programa, ya que el codigo de la funcion se reescribe en el lugar en que se utiliza y no se produce una llamada a una funcion definida de forma independiente. Definimos entonces el codigo como parte de la declaracion de la clase, no en la implementacion de las funciones. Si el codigo de la funcion es demasiado largo, el compilador puede ignorar el requisito de inline y tratarla como un metodo implementado independientemente, pero lo hara de forma invisible al usuario. Las funciones inline violan el principio de proteccion de la informacion, ya que el se hace el codigo de la funcion visible al usuario.
Anterior: clases static
Siguiente: punteros a clases