Programación II. Guía No.6 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Punteros a Objetos. Puntero this. Objetivos Manejar objetos por medio de punteros. Utilizar el puntero this. Implementar programas en C++ que incluyan el uso de punteros a Objetos y la utilización del puntero this. Materiales y Equipo • Computadora con el software DevC++. • Guía Número 6. Introducción Teórica Punteros a objetos. Pueden declararse punteros que apuntan a objetos, la sintaxis a utilizar para la declaración es la común, solo es diferente el modo en que es invocado un dato o función miembro. Con tal fin se utiliza el operador "->”. La sintaxis para la declaración de punteros a objetos es la siguiente: <Nombre de clase> * <puntero a objeto>; Un ejemplo de la declaración basado en la clase Triangulo de la guía anterior es el siguiente: Triangulo *pTri1; Para definir un puntero apuntando a un objeto con asignación dinámica de memoria se usa la siguiente sintaxis: <nombre de puntero> = new <nombre de clase>; 2 Programación II. Guía No. 6 Ejemplo: pTri1 = new Triangulo(2.8, 9.0); La sintaxis para el acceso a miembros de clase a partir de un puntero a objeto es la siguiente <nombre de puntero> -> <miembro>; Ejemplo: pTri1->CalculaArea( ); Se recomienda que a los nombres de puntero se les anteponga una “p” para su rápido reconocimiento por parte del programador. Los punteros pueden inicializarse como puntero nulo o a través de otro puntero ya inicializado. Sin embargo estas opciones hacen al puntero una entidad dependiente de la memoria que se haya reservado para los objetos que asignan su dirección al puntero. Para que el puntero tenga respaldo independiente en memoria, la forma indicada es la reserva de memoria dinámica para el mismo. El puntero implícito "this". El puntero this es un atributo especial del objeto, el cual guarda la dirección de memoria del objeto para poder referirse a si mismo en cualquier momento, esto es usado por la manera de distribuir los objetos en memoria: los atributos de cada objeto son independientes de los de otro objeto, pero los métodos son compartidos por todos los objetos declarados del mismo tipo de clase, así cuando se llama un método del objeto, implícitamente se manda como parámetro el puntero this de ese objeto para que el método sepa a que atributos referirse a la hora de procesarlos. En C++ se define this dentro de un objeto como un puntero al objeto en que está contenido. Se declara implícitamente como: class_name *this; El puntero this se inicializa para apuntar al objeto para el cual se llama a la función miembro. Este puntero es muy útil cuando se trabaja con punteros y especialmente en listas enlazadas, cuando se necesita referenciar un puntero al objeto que se está insertando en la lista. Programación II. Guía No. 6 3 La palabra this está disponible para este propósito y puede ser utilizada en cualquier objeto. Realmente la forma apropiada de referenciar a cualquier variable en una lista es a través del uso del puntero predefinido this, escribiendo this -> nombre del miembro, pero el compilador supone que se está usando, y podemos omitir el puntero. También hay que tomar en cuenta que: • El tipo de este apuntador this depende del tipo del objeto al cual apunta y que no puede ser declarado explícitamente, es decir, es declarado y definido por el compilador. • Un uso del apuntador this es impedir que un objeto sea asignado a sí mismo. • Es una variable local, es decir, que no puede ser usado explícitamente fuera de la clase. El puntero this siempre es usado de manera implícita, asi la llamada a la función CalculaArea del ejemplo de la clase Triangulo, puede ser usada con el puntero this manteniendo su estructura: float Triangulo::CalculaArea ( ) { return (this->Base * this->Altura/2); } Un ejemplo del uso del puntero this es el retornar la dirección de memoria del objeto: Triangulo *Triangulo::miDireccionDeMemoria ( ) { return this; } Procedimiento Ejemplo 1: Uso de puntero this y arreglo de objetos. 4 Programación II. Guía No. 6 #include <iostream> using namespace std; class miclase { public: miclase( ) { }; void EresTu(miclase& c) { if(&c == this) cout << "Si, soy yo." << endl; else cout << "No, no soy yo." << endl; } }; int main( ) { miclase *pC1 = new miclase; miclase *pC2 = new miclase; pC1->EresTu(*pC2); pC1->EresTu(*pC1); cin.get( ); return 0; } 1. ¿Para qué sirve el puntero this en el ejemplo? 2. Porque se usa el operador * con los parámetros de la función EresTu Ejemplo 2: El siguiente ejemplo muestra otras formas de utilizar el puntero this. #include<iostream> #include<conio.h> class Paralelepipedo { private: float alto; float ancho; float largo; double volumen; public: Paralelepipedo(float, float, float); double calcular_volumen( ); }; Programación II. Guía No. 6 5 Paralelepipedo::Paralelepipedo(float x,float y,float z) { this->alto = x; this->ancho = y; this->largo = z; } double Paralelepipedo::calcular_volumen() { this->volume = this->alto * this->ancho * this->largo; return this->volumen; } int main( ) { Paralelepipedo objeto1 = Paralelepipedo(10, 5, 10); cout<<"volumen de objeto 1: "<<objeto1.calcular_volumen( ); getch( ); } Ejemplo 3: En este ejemplo se muestran únicamente los cambios que habría que hacerse para el ejemplo mostrado en la guía anterior (Guía No. 5), haciendo uso del puntero this. #include <iostream> #include <iomanip> using namespace std; #define CAL 5 // Define constante para el numero de calificaciones a manejar class Alumno // Definición de la clase { private: char nombre[50]; float calificaciones[CAL]; public: Alumno( ){}; ~Alumno( ){}; void ingresar( ); void mostrar_nombre( ); void reporte( ); // Función set // Muestra el nombre del alumno // Muestra las notas del alumno }; void Alumno::ingresar( ) //Ingresa los datos de un alumno { fflush(stdin); cout <<"Ingrese el Nombre del estudiante : "; gets(this->nombre); int i; 6 Programación II. Guía No. 6 for (i = 0; i < CAL; i++) { cout << "Por favor ingrese la calificacion No. " << i+1; cout <<" : "; cin >> this->calificaciones[i+1]; } } void Alumno::mostrar_nombre( ) { cout << this->nombre; //Escribe el nombre del alumno en la pantalla } void Alumno::reporte() { int i; //Genera reporte del estudiante seleccionado cout<<"------------------------------------------------------"<<endl; // Se le da formato a la tabla. for (i = 0; i < CAL; i++) { cout<<setw(15)<<"Nota "<<i+1<<" : "<<this->calificaciones[i+1]<<setw(5)<<endl; } } int main( ) { …. } Análisis de Resultados Ejercicio 1: Modifique el código del ejercicio No.1 desarrollado en la guía anterior (Guía No. 5) para la simulación de un sistema de control de notas de tal manera que la solución planteada haga uso de punteros a objetos y el puntero this. Investigación Complementaria Escribir un programa en C++ que simule la operación de una gasolinera haciendo uso de punteros a objetos y el puntero this. La gasolinera debe manejar al menos 6 bombas de combustible y cada bomba manejará tres tipos de combustibles. Los tipos de combustibles que se manejarán serán: Gasolina Especial, Gasolina Regular, Diesel. Programación II. Guía No. 6 7 En cualquier momento durante la simulación deberíamos poder determinar, a partir de la bomba seleccionada, el precio por galón de combustible y la cantidad restante en el tanque de suministro. Si la cantidad de combustible en el tanque de suministro es mayor o igual que la cantidad de combustible solicitada, la solicitud debe despacharse; de lo contrario, solo deberá usarse la cantidad disponible en el tanque de suministro. Una vez que se ha bombeado el combustible, deberá desplegarse el precio total de los galones surtidos y la cantidad de combustible en galones que se ha bombeado deberá restarse de la cantidad sobrante en el tanque. Para la simulación suponga que la capacidad de las bombas es la siguiente: Para gasolina especial: 600 galones y el precio por galón es de $4.45. Para gasolina regular: 800 galones y el precio por galón es de $3.95. Para diesel: 800 galones y el precio por galón es de $4.25. Deberá considerarse un menú con las siguientes opciones: a) Verificar el nivel de combustible de una bomba en particular. b) Verificar el precio por galón. Aquí deberá considerarse la opción de poder cambiar el precio por galón del combustible en cualquier momento. c) Surtir un pedido solicitado en un monto de dinero( por ejemplo: $15.00) d) Surtir un pedido solicitado en número de galones( por ejemplo: 5 galones) e) Salir de la aplicación. El programa debe estar debidamente comentado. 8 Programación II. Guía No. 6 Guía 6: Punteros Puntero this. a Objetos. Hoja de cotejo: Alumno: Máquina No: Docente: GL: Fecha: 1-4 5-7 8-10 Conocimiento deficiente de los fundamentos teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. 6 EVALUACIÓN % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% TOTAL 100% Nota