introducción poo
DESCRIPTION
Guía para el aprendizaje de la Programación Orientada a ObjetosTRANSCRIPT
1
Universidad Centroccidental “Lisandro Alvarado”
Decanato de Ciencias y TecnologíaLapso 2010-2
Introducción a la
Programación Orientada a Objetos (POO)
con C++
Programa de Análisis de SistemasCoordinación del Área de Computación
2
Programación de Funciones
Una función contiene una o más sentencias y se crean generalmente para realizar una única tarea.En la Programación Orientada a Objetos, las funciones se utilizan para definir los métodos de las clases.
Todos los lenguajes de programación ofrecen innumerables funciones que ya están
programadas, y también la posibilidad de crear nuevas por parte del programador. A estas se les denomina Funciones Definidas por el
Usuario, considerándote a ti como usuario del Lenguaje (programador).
3
Programación de Funciones
Implementación de una Función:tipo_de_retorno NombreFuncion (lista parámetros){ sentencias return valor;}
Cuando en el tipo de retorno aparece la palabra reservada void significa que la función no retorna ningún valor.void NombreFuncion (lista parámetros){ sentencias .....}
Usualmente se les denomina Procedimientos a las funciones que no
retornan ningún valor
4
Parámetros de una función
• También se conocen como Argumentos.• Una función puede utilizar parámetros por
valor y parámetros por referencia, o puede no tener parámetros.
• TIPOS DE ARGUMENTOS SEGÚN• EL VALOR QUE RETORNAN
Párametros por valor: En C++ el paso por valor significa que al compilar la función y el código que llama a la función, ésta recibe una copia de los valores de los parámetros que se le pasan como argumentos. Las variables reales no se pasan a la función, sólo copias de su valor.
5
Tipos de parámetros según lo que retornan
Según el valor que puede retornar un argumento, los parámetros se clasifican en parámetros por valor o por
referencia
COMPARACIÓN ENTRE PARÁMETROS POR VALOR Y POR REFERENCIA
ComparaciónTipo
parámetroPor valor Por referencia
Cómo identificarlos Se declaran sin & Se declaran con &
Qué recibe la funciónCopia de los valores de los argumentos que se
pasan
El mismo valor que el argumento que se pasa
(la misma dirección)Cómo se afecta el parámetro que se
envía
No cambia el valor del argumento original
El cambio es retornado al argumento original
Entrada y/o salida Solo de entrada Son de entrada y salida
6
Tipos de parámetros según su ubicación
Tanto en la definición (cabecera) de la función como en las llamadas deben colocarse parámetros:
• Parámetros formales: están en la definición de la función (cabecera).
• Parámetros actuales: están en cada llamada a una función.
COMPATIBILIDAD ENTRE PARÁMETROS FORMALES Y PARÁMETROS ACTUALES
ReglaCompatibilidad Debe cumplir con lo siguiente
Misma cantidadPara N parámetros formales deben haber N
parámetros actuales. Ej: si hay 3 parámetros en los formales, deben haber 3 en los actuales
Mismo tipoDeben ser parámetros del mismo tipo. Ej: Si en los formales hay un char y un int, igualmente deben haber un char y un int en los actuales
Mismo orden
Deben estar en el mismo orden. Ej: si en los formales hay un char y un int, y en los actuales
hay un int y un char, ambos pares de parámetros tienen el mismo tipo pero no están
en el mismo orden.
7
Ejemplos de funciones
Ejemplo de una Función con parámetros
void ImprimirMensaje (string mensaje) { cout << mensaje << endl;}
Llamado de la función ImprimirMensaje ImprimirMensaje (“Ingrese los siguientes datos:”);
Parámetros formales
de la función
Parámetros actuales de la
función
Ejemplo de Funciones sin parámetros
void LimpiarPantalla () { system (“cls”);}void DetenerPantalla () { system (“pause”);}
Igual se colocan paréntesis que abre y cierra (sin
argumentos)
Funciones que no
ameritan argumento
s
Llamado de las funciones anterioresLimpiarPantalla ();DetenerPantalla ();
8
Programación Orientada a Objetos (POO)
Conceptualización• Es un paradigma de programación que usa objetos y sus
interacciones, para diseñar aplicaciones y programas de computadora.
• Es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real.
• Se basa en la idea natural de la existencia de un mundo lleno de objetos, de modo que la resolución del problema se realiza en términos de objetos.Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro, sino que cada uno tiene sus ventajas y sus inconvenientes.
También hay situaciones donde un paradigma resulta más apropiado que otro, e incluso pueden usarse de manera
combinada.
Otros paradigmas de Programación:
• Programación Estructurada o por Procedimientos.
• Funcional.
• Lógico.
• Visual
9
Clases, Instancias y Objetos
Clase: Representa un dato de tipo objeto, es su definición, no puede tomar valores ni ejecutar métodos.Instancia: Un ejemplar de una clase. Una variable de algún tipo de objeto.Objeto: Un objeto es una Instancia de una Clase. Un objeto en POO, representa alguna entidad de la vida real, es decir, alguno de los objetos que pertenecen al negocio con que estamos trabajando o al problema con el que nos estamos enfrentandoCOMPARACIÓN ENTRE CLASES, INSTANCIAS Y OBJETOS
ElementoEntorno Si para variables es Para POO es
Declaración Un tipo de dato Una ClaseNombre del dato Una variable Un Objeto o Instancia
Las clases son a los objetos como lo son los tipos de datos a las variables. Es decir, los tipos de datos definen el tipo de contenido que tendrán las variables, las clases definen la estructura de los
objetos
10
Composición de los Objetos
Un Objeto en POO es cualquier cosa tangible o no, la cual se describe sobre la base de sus datos o propiedades (atributos) y
funciones (métodos) que definen su comportamiento.
Los atributos y métodos que están asociados se dicen que están encapsulados en una única entidad (Encapsulación). Los métodos dentro del objeto deben ser el único medio de acceder a los datos
privados de ese objeto (Ocultación).
• Un método es un conjunto de instrucciones que realizan una determinada tarea y son similares a las funciones de los lenguajes estructurados.
Los atributos pueden tomar un valor. Ejemplo de atributos: Edad, Color, Peso. Suma, etc. Si piensas que Sumar pudiera ser un
atributo, te equivocas. Fíjate: Sumar indica una acción y no un dato. Seguramente Sumar será un proceso que calcula el
atributo Suma.
• Un atributo es una característica individual que diferencia un objeto de otro y determinan su apariencia, estado u otras cualidades.
Ahora sí podemos usar Sumar, ya que indica una acción (comportamiento) el cual será el cálculo del atributo Suma.
11
Ejemplos de Objetos
Métodos:- Llamar- Contestar- Encender- GuardarNro
Atributos:- Tipo- Numero- Operadora- Modelo
Fíjate que a cada uno de los atributos es posible asignarle un valor. Ej: Tipo=Celular, Numero=0414-123.45.67,
Operadora=Cantv, Modelo=Samsung. Por su parte, los métodos denotan alguna acción con el celular.
Un Teléfono en términos de objetos
Métodos:- Abrir- Depositar- Retirar- Cerrar
Atributos:- NumeroCta- Titular- FechaApertura - SaldoActual
Observa que una cuenta bancaria es un objeto intangible, una forma de representarla es con una libreta de ahorros. Otro ejemplo: si te piden calcular el promedio de 3 números, tendremos un objeto
que llamaríamos Calculo.
Una Cuenta Bancaria en términos de objetos
12
Lenguajes Orientados a Objetos
En la actualidad la mayoría de los lenguajes de programación admiten la Programación Orientada a Objetos. Un lenguaje de
programación orientado a objetos es aquel que admite el paradigma de la POO.
En este curso programarás con C++ y el entorno de desarrollo integrado (IDE) Dev-C++, el cual te ofrece una interfaz de fácil operación que te permite:• Escribir los programas• Compilarlos• Ejecutarlos• Depurarlos
Otros lenguajes que admiten objetos son los siguientes:• Object Pascal, y el entorno Borland Delphi• Java, con el entorno NetBeans• Basic, con el entorno Microsoft Visual Basic• XBase, con el entorno Microsoft Visual FoxPro
13
Lenguajes Orientados a Objetos
Observa en la siguiente ilustración el aspecto de la IDE con la que trabajarás en este curso.
IDE DEVC++, PARA EL LENGUAJ E ORIENTADO A OBJ ETOS C++
BARRAS DE HERRAMIENTAS que te permiten múltiples acciones:
compilar, ejecutar, etc.
EXPLORADOR DE OBJ ETOS que conforman tu proyecto.
EL CÓDI GO DE CADA OBJ ETO organizados en pestañas.
DEPURADOR DE PROGRAMAS para que pruebes y corrijas.
PODEROSO EDI TOR que te facilita la escritura de tus programas.
14
Pilares de la Programación Orientados a Objetos
15
Abstracción
i) El proceso para calcular el promedio de 3 números puede explicarse así: “sumamos los números y dividimos entre 3”.
ii) Cuando vamos a programarlo, tenemos que: a- Declarar variables, b- mostrar un mensaje en pantalla para pedir cada número, c- leer los números, d- asignarlos la suma a una variable Total, e- Dividir el
total entre 3 y asignarlo a la variable Promedio, f - Mostrar un mensaje en pantalla indicando que se presentará el resultado, g-
Mostrar la variable Promedio.
iii) ¿Puedes ver cómo el punto (i) “ignora” una serie de pasos y se “concentra” en el proceso mismo?
iv) El punto (ii) es más bien el “cómo se hace”, mientras el punto (i) es el “qué hace”
• La abstracción consiste en aislar un elemento de su contexto o del resto de los elementos que lo acompañan.
• En programación, el término se refiere al énfasis en el "¿qué hace?" más que en el "¿cómo lo hace?" (Característica de caja negra).
• Ejemplificación de la Abstracción:
16
Encapsulamiento
Se denomina encapsulamiento al ocultamiento del estado de los componentes de un objeto, de manera que sólo se pueden cambiar mediante las operaciones definidas para ese objeto
La mejor f orma de comprender el encapsulamiento es imaginar que todo objeto tiene un número determinado de “acciones” o
comportamientos, cada uno de los cuales se “activa” pulsando un botón. Cada botón le envía el mensaje al objeto para que procese y cambie sus atributos dentro de su “caja negra”. Más adelante en este curso veremos cómo para cada requerimiento de un objeto
tendremos que programarle un “botón”; finalmente, usar el objeto (correr el programa) consistirá en pisar los botones necesarios.
17
Herencia
La herencia es el mecanismo fundamental para implementar la reutilización y extensibilidad del software. A través de ella los diseñadores pueden construir nuevas clases partiendo de una jerarquía de clases ya existente (comprobadas y verificadas) evitando con ello el rediseño, la remodificación y verificación de la parte ya implementada
Jerarquía de clases de transportes
18
Polimorfismo
El polimorfismo se refiere a la posibilidad de definir en una jerarquía de clases métodos y/o atributos denominados de forma idéntica, pero que se comportan de manera distinta
PARA CADA CLASE DERIVADA también cuenta BsEnBanco PARA ESTUDIANTE hay que sumarle Computador y Celular PARA PROFESOR hay que sumarle Carro y Casa
EL TOTALCAPI TAL para las clases
derivadas tendrá algunas variantes
Clase Estudiante - ValorComputador - ValorCelular - TotalCapital
LA CLASE BASE Persona con sus componentes (Propiedades: Nombre, Cedula, BsEfectivo, BsDebe, Comportamiento: cálculos de Totales)
DEMOSTRACIÓN DE UN CASO DE POLIMORFISMO
Clase Persona - Nombre - Cédula - BsEfectivo - BsDebe - TotalCapital - TotalDeudas - TotalPatrimonio
Clase Profesor - ValorCarro - ValorCasa - TotalCapital
ASUMIREMOS de la manera más elemental, que el TotalCapital de cualquier persona es el dinero en efectivo que tiene, y
TotalDeudas es lo que debe en efectivo; así, TotalPatrimonio es la diferencia entre los totales anteriores
CON ESTAS FLECHAS queremos denotar que hay una herencia entre las clases señaladas
UN PROFESOR es una persona; componentes adicionales: ValorCarro y ValorCasa
UN ESTUDI ANTE es una persona; componentes
adicionales: ValorCelular y ValorComputador
19
Identificación de Objetos
Una técnica a seguir para lograr la identificación de los objetos es subrayar cada sustantivo (nombre) presente en el planteamiento del problema. Ej:• Hacer un programa que permita leer las operaciones
realizadas a una cuenta bancaria y determinar al final el saldo de la misma.
• Se desea determinar la nota final de un estudiante sabiendo que presentó 3 pruebas parciales.
• En una organización laboran varios trabajadores que tienen un sueldo base, asignaciones y deducciones. Se desea determinar el sueldo neto de cada trabajador.Algunos criterios a seguir para identificar los
objetos son:• Cosas tangibles (mesa, carro, avión). • Organizaciones (empresa, departamentos, divisiones) • Incidentes (representa un suceso, Ej: vuelo, inscripción,
transacción). • Papeles o roles (cliente, empleado, médico).• Interacciones (compras, ventas). • Lugares (ciudad, muelle de carga, sala de embarque).
20
Identificación de Objetos
Considere lo siguiente al momento de identificar los objetos que participan en un planteamiento:• Posiblemente subrayarás múltiples sustantivos, no todos tendrás
que usarlos en tu programa.• Inicialmente cuando haces el subrayado, lo que tienes es varias
objetos candidatos (candidatos a ser el objeto que usarás).• Producto de un análisis más detallado terminarás determinando
cual (o cuales) objetos serán los definitivos.• Los objetos que determinas que no usarás simplemente forman
parte de la redacción del enunciado, pero no de la solución del problema. De alguna manera u otra estos objetos que no usarás te servirán para comprender la información que te suministra el planteamiento.
En una organización laboran varios trabajadores que tienen un sueldo base, asignaciones y deducciones. Se desea determinar el sueldo neto de cada trabajador y el total a pagar por la empresa.
I DENTI FICACI ÓN DE OBJ ETOS Y SUS COMPONENTES
I NFORMACIÓN DE ENTRADA: sueldo base, asignaciones, deducciones
OBJ ETOS CANDIDATOS: organización, trabajadores, trabajador, empresa
REQUERIMIENTOS: determinar el sueldo neto de cada trabajador
I MPORTANTE: en ocasiones la información de entrada está implícita
21
Ejemplificación de Requerimientos
La forma más inequívoca de expresar los requerimientos es con la formulación de al menos una situación que ejemplifique lo que se necesita. Ejemplificar requerimientos es en programación de computadoras similar a: • Una maqueta de un centro comercial, presentada por un
arquitecto.• La radiografía de un hueso roto que muestra un doctor.• El dibujo de un vestido que presenta un diseñador.• Una tabla con la información de sueldos de los trabajadores de la
organizaciónNota que todas las situaciones mencionadas presentan
visualmente lo requerido por parte de un cliente:• Construir un Centro Comercial, que es requerido por un
inversionista con mucho dinero que no sabe nada de Ingeniería Civil.
• Enyesar un brazo, que es requerido por una persona herida.• Elaborar un vestido, que es requerido por la novia que va a
casarse.• Hacer un programa que determine el sueldo neto de cada
trabajador y el total a pagar por la empresa.
Lo más común en el planteamiento de problemas de programación es que te enfrentes a un texto con la redacción de requerimientos, o sea un montón de palabras. Cuando se hace
la ejemplificación de lo requerido, logras una completa comunicación con el cliente y lo que necesita.
22
Ejemplificación de Requerimientos
El planteamiento de problemas de programación seguramente no contará con todo detalle, tendrás que abordar al cliente y
lograr mayores especificaciones a fin de que puedas crear una EJEMPLIFICACIÓN CON LA QUE ESTÉN AMBOS EN
ACUERDO.
I DENTIFI CACI ÓN DE OBJ ETOS Y MIEMBROS POR EJ EMPLIFI CACI ÓN TABULADA
TODA LA TABLA representa la información del objeto Organización
CADA REGISTRO muestra la información de un objeto trabajador
LOS DATOS DE ENTRADA por columnas serán
atributos del trabajador
CÁLCULOS POR REGISTRO serán métodos del
trabajador
CÁLCULOS TOTALES DE LA
TABLA serán métodos de la organización
DATOS GENERALES DE ENTRADA serían atributos de la organización. Para este ejemplo, podría ser el total
que dispone la empresa para pagar sueldos. Así, si se pide el restante luego del pago, tendríamos otro
método para organización: TOTALRESTANTE.
23
El control remoto de los objetos
Otra técnica para identificar los componentes de los objetos es precisamente imaginarlos como un aparato (o robot) que opera con un control remoto, donde:• El aparato tiene componentes internos, que tal vez no sea
preciso visualizarlos en primera instancia (están encapsulados). Estos componentes internos serán los atributos y métodos.
• También tiene botones, cada uno de los cuales permitirá resolver un requerimiento del problema.
• Cuando presionamos los botones, según necesitemos, el objeto realizará algunas acciones (procesos) que alterarán los atributos, o bien nos mostrarán el resultado de lo que deseamos hacer.
• Los botones servirán entonces tanto para que veamos el funcionamiento de nuestro programa, como para que los objetos que lo conforman se comuniquen entre sí.
24
El control remoto de los objetos
Más nubes
Cambiar turno
Cambiar turno
Mostrar Sol
Arco Iris
Llover
Agregar trabajador
Mostrar sueldo neto
Agregar trabajador
Totalizar empresa
Agregar trabajador Agregar trabajador
CAMBIAR TURNO
LLOVER
MOSTRAR SOL
MOSTRAR LUNA
MÁS NUBES
ARCO I RIS
25
Representación de Clases
FECHA
- dia : int - mes : int - anno : int
+ Fecha () + Fecha (d:int, m:int, a:int) + SetDia (d:int) + SetMes (d:int) + SetAnno (d:int) + GetDia () :int + GetMes () :int + GetAnno () :int
NOMBRE DEL OBJ ETO
PRIVADO (- )
PÚBLI CO (+)
PROTEGIDO (#)
ATRIBUTOS
OPERACIONES
(MÉTODOS)
REPRESENTACIÓN DE UNA CLASE SEGÚN LA NOTACI ÓN UML
Visibilidad <nombre>: tipo [= valor inicial]
Privado (-), público (+), protegido (#) Nombre del atributo
Tipo de dato del atributo El valor inicial es opcional
SI NTAXI S PARA REPRESENTAR LOS ATRI BUTOS EN LA CLASE, SEGÚN UML
visibilidad nombre ([lista de parámetros]): tipo retorno
Privado (-), público (+), protegido (#) Nombre del atributo
Argumentos del método (opcionales). Los paréntesis SI EMPRE debes colocarlos.
El tipo de valor que retorna
SINTAXIS PARA REPRESENTAR LOS MÉTODOS EN LA CLASE, SEGÚN UML
26
Representación de Clases
Organización
- ArrayTrabajadores : vector - BsDisponeParaSueldos : float
- SetBsDisponeParaSueldos (Bs : float) - GetBsDisponeParaSueldos () : float - I ncluirTrabajador (Nomb...) - GetTotalNomina () : float ::::::::::::
Trabajador
- Nombre : string - SueldoBase : float - Asignaciones : float - Deducciones : float
- Sets... - Gets... - CalcularSueldoNeto () : float ::::::::::::
1 1..*
En este caso la relación se llama composición, ya que la organización está compuesta por varios
trabajadores. Los números indican: una organización tiene al menos 1 trabajador (1..*), pero un trabajador
siempre pertenece a una organización
El diagrama de clases muestra todas las clases que participan en
la solución del problema y las relaciones entre ellas.
DI AGRAMA DE CLASES (INCOMPLETO) DEL EJ ERCICI O DE LA ORGANIZACIÓN
27
Objetos en C++
Un Programa Orientado a Objetos en C++, está compuesto por:
• Varias librerías de uso genérico, bien sean incorporadas al lenguaje o programadas por el usuario.
• Una carpeta en el disco duro (o pendrive) con el nombre del proyecto.
• Clases propias para el programa. Cada clase se almacena en 2 archivos: uno para la interfaz (extensión .h) y otro para la implementación (extensión .cpp). Estos archivos van dentro de la carpeta del proyecto
Cada clase que se diseña tendrá 2 partes:
• La interfaz: contiene solamente la declaración de los componentes de la clase, siguiendo la sintaxis de C++.
• La implementación: contiene la programación de los métodos de la claseNuestro ejemplo de la organización requerirá al menos 5
archivos: Organización.h, Organización.cpp, Trabajador.h, Trabajador.cpp y Principal.cpp
28
Objetos en C++: Interfaz de Clase
#ifndef <NombreArchivo_H>#define <NombreArchivo_H>#include <NombreLibreria>[#include <NombreLibreria> [...]]class <nombreClase> { <componentes>};#include “NombreArchivo.cpp”#endifComponentes de tipo atributo=[private:|public:|protected:] <TipoCampo> <NombreCampo>; [<TipoCampo> <NombreCampo>; [...]]Componentes de tipo método=[private:|public:|protected:] <TipoDevuelto> <NombreMétodo> ([<parametros>]); [<TipoDevuelto> <NombreMétodo> ([<parametros>]); [...]]
Sintaxis para la programación de la interfaz de una clase
Proy-Empresa\ Trabajador.h
#ifndef TRABAJADOR_H #define TRABAJADOR_H #include <string> class trabajador { private: float sueldo_base, asignaciones, deducciones; public: // Acá se omiten algunas líneas que veremos más adelante float CalcularSueldoNeto (); }; #include "Trabajador.cpp" #endif
I NTERFAZ DE LA CLASE TRABAJ ADOR
Busca la carpeta Proy-Empresa en nuestro Banco de Ejercicios. Observa la siguiente interfaz para la clase
trabajador de nuestro ejemplo; el archivo respectivo se llamará Trabajador.h, dentro de la carpeta Proy-Empresa. Se han omitido
algunas instrucciones que se explicarán luego.
29
Objetos en C++: Implementación de Clase
<nombreClase> :: <NombreMetodo> { <sentencias> } [<nombreClase> :: <NombreMetodo> { <sentencias> } [...]] <sentencias> = una sentencia simple o un bloque de instrucciones
SINTAXIS PARA LA PROGRAMACIÓN DE LA IMPLEMENTACIÓN DE UNA CLASE
Proy-Empresa\ Trabajador.cpp
// Acá se omiten algunas líneas que veremos más adelante float trabajador :: CalcularSueldoNeto () { return sueldo_base + asignaciones - deducciones; }
I MPLEMENTACIÓN DE LA CLASE TRABAJ ADOR
Faltan las líneas para: el constructor, los Sets y los Gets, lo cual se explicará más adelante
Busca la carpeta Proy-Empresa en nuestro Banco de Ejercicios. Observa la siguiente implementación para la clase
trabajador de nuestro ejemplo; el archivo respectivo se llamará Trabajador.cpp, dentro de la carpeta Proy-Empresa. Se han omitido
algunas instrucciones que se explicarán luego.
30
Objetos en C++: El Programa Principal
[#include <<LibsDeC++>>] [#include <“LibsPropias”>] using namespace std; int main () { <sentencias> } <sentencias> = una sentencia simple o un bloque de instrucciones
SINTAXIS PARA LA PROGRAMACIÓN DEL PROGRAMA PRI NCIPAL
Proy-Empresa\ Principal.cpp
#include <iostream> #include "Trabajador.h" using namespace std; int main () { float sueldo, asig, deduc; cout << "Introduzca sueldo base: "; cin >> sueldo; cout << "Introduzca asignaciones: "; cin >> asig; cout << "Introduzca deducciones: "; cin >> deduc; trabajador t (sueldo, asig, deduc); // Creación de la instancia cout << "El sueldo neto es: " << t.CalcularSueldoNeto () << "\n"; system("PAUSE"); }
I MPLEMENTACIÓN DEL PROGRAMA PRINCIPAL
Busca la carpeta Proy-Empresa en nuestro Banco de Ejercicios. Observa el programa principal de nuestro
ejemplo; el archivo respectivo se llamará Principal.cpp, dentro de la carpeta Proy-Empresa.
Observa la línea con el comentario de creación de la instancia, es en ese momento (cuando se especifica que se creará un objeto del tipo trabajador) cuando el programa en ejecución destinará espacios de memoria para la creación del objeto. Es en ese momento cuando se ejecuta el constructor respectivo a los argumentos enviados (verás
la explicación más adelante).
31
Objetos en C++: ConstructoresEs un método especial que se ejecuta automáticamente al momento de la creación de un objeto; su propósito es la inicialización de los atributos del objeto, bien sea con valores predefinidos o con valores que se “pasan” al objeto a través de parámetros.
Consideraciones:• Se denominan exactamente igual que la clase.• Pueden haber varios constructores en una clase, con la
diferenciación entre ellos de los argumentos que reciben (sobrecarga de métodos).
• Para efectos de este curso, principalmente se usarán 2 constructores: (valores predeterminados, y otro que recibe los argumentos de inicialización).
• En la interfaz de la clase, solamente colocarás al encabezado.• En la implementación, entonces declaras la implementación.• En caso de que sea un constructor de inicialización
predeterminada, colocarás valores base.La sobrecarga de métodos y/o funciones es una cualidad de los lenguajes de programación que permite la definición de métodos / funciones con el mismo
nombre pero con diferentes argumentos; el programador, al momento de necesitar el método / función, decidirá cuales argumentos enviar, y de esta manera, casando
la cantidad, tipos y orden de los argumentos, el compilador identifica cual es la implementación respectiva.
32
Objetos en C++: Setters (Sets) y Getters (Gets)
•La función Set es un método que nos permite modificar el valor (asignar) de una variable privada (atributo) de una clase.
•La función Get es un método que nos permite visualizar el valor de una variable privada (atributo) de una clase, en otras palabras provee el valor del atributo a quien lo solicite.
Considera lo siguiente en relación a los Sets y Gets:•Por cada atributo debería existir un Set y un Get.•Con frecuencia podrás solamente implementar los Sets y Gets de los atributos que necesites para resolver el problema que se te plantea. Queda a discreción del profesor si te permite esto.
•Los Sets constituyen un método cuya única función será asignarle un valor a un atributo en particular, el cual viene por parámetro. Dado que no tiene que retornar valor, los Sets son procedimientos, o funciones void.
•Los Gets son métodos que se invocarán para que retornen el valor de una atributo en particular, de manera que el tipo de retorno de cada Get dependerá del tipo del atributo que retorna.
33
Objetos en C++
::: class trabajador { private: float sueldo_base, asignaciones, deducciones; public: // Este es el constructor predeterminado trabajador (); // Este es el constructor de inicialización trabajador (float, float, float); void SetSueldo_Base (float); void SetAsignaciones (float); void SetDeducciones (float); float GetSueldo_Base (); float GetAsignaciones (); float GetDeducciones (); float DetSueldoNeto (); }; :::
Proy-Empresa\ Trabajador.h I NTERFAZ DE LA CLASE TRABAJ ADOR
Constructor predeterminado
Constructor de inicialización
Sets (Setters)
Gets (Getters)
Métodos de requerimientos
Se omitieron las directivas #ifndef , #include, etc
trabajador :: trabajador (){ sueldo_base = asignaciones = deducciones = 0; } trabajador :: trabajador (float sb, float a, float d){ sueldo_base = sb; asignaciones = a; deducciones = d; } void trabajador :: SetSueldo_Base (float sb){ sueldo_base = sb; } ::: float trabajador :: GetSueldo_Base (){ return sueldo_base; } ::: float trabajador :: DetSueldoNeto () { return sueldo_base + asignaciones - deducciones; }
Proy-Empresa\ Trabajador.cpp I MPLEMENTACI ÓN DE LA CLASE TRABAJ ADOR
Constructor predet
Constructor de inicialización
Sets (Setters)
Gets (Getters)
Métodos de requerimientos
Se omitieron algunos Sets y Gets... su implementación es similar
34
Integración de componentes con DevC++
Vea depuración en ¡Error! No se encuentra el origen de la referencia., pág ¡Error! Marcador no definido.
I NTEGRACI ÓN DE COMPONENTES DEL PROYECTO
Pestaña que lleva al contenido del archivo Principal.cpp
Pestaña que lleva al contenido del archivo Trabajador.h
Pestaña que lleva al contenido del archivo
Trabajador.cpp
En el proyecto se agregan: el archivo principal y todas las
interfaces de clases (.h); las implementaciones
(.cpp) no deben agregarse ya que se producen
errores de compilación.
PARA ACCEDER AL .CPP: abra la interf az de la clase respectiva, mantenga presionada la tecla
Ctrl y haga clic en el #include del .cpp
La interfaz de desarrollo integrado (I DE) de DevC++ te permite:
Escribir los programas Compilarlos y ejecutarlos Crear el programa ejecutable Probarlos y depurarlos
BARRA DE HERRAMIENTAS EN LA IDE DE DEVC++ Vea depuración en ¡Error! No se encuentra el origen de la referencia., pág ¡Error! Marcador no definido.
Crear nuevo proyecto Abrir proyecto
Nuevo archivo fuente
Sólo compilar
Ejecutar Compilar y Ejecutar
Reconstruir todo (recomendable)
Depuración Añadir o quitar archivo del proyecto
Opciones para guardar archivo o todo el proyecto
35
PASO A PASO PARA CREAR UN POO CON DEVC++ 1- Crea la carpeta del proyecto con el Explorador de Windows
2- Entra a DevC++ y crea un nuevo proyecto
3- El proyecto es de tipo Console Application
4- Asigna un nombre significativo al proyecto, y clic en Aceptar.
5- Ubica la carpeta del proyecto, asigne el mismo nombre que usó en el paso anterior, y clic en Guardar
6- Clic en “+” para ver todos
los archivos del proyecto
7- Seleccionar todo el texto (Ctrl+A),
borrar y escribir tu Programa Principal
8- Guarda el archivo actual con nombre Principal.cpp
9- Agrega un nuevo archivo fuente (para cada clase), clic en Yes y graba archivo con nombre Trabajador.h
10- Agregas otro nuevo archivo fuente (para el .cpp), y grabas con nombre Trabajador.cpp, pero debes eliminarlo de la lista de archivos
para que te compile el proyecto
11- Seleccionando Trabajador.cpp, clic derecho y Remover Archivo lo
quita del proyecto
12- Compilar todo. Obtendrás Done (listo) cuando no tengas errores
13- Ejecutar
14- Tu programa está corriendo!
36
Identificación de errores de compilación
Revisa la carpeta con el proyecto Proy-EstudPat
I DENTIFICACI ÓN DE ERRORES DE COMPILACI ÓN
class CtaBanco { private: float saldo_actual; char tipo_op; float monto; public: CtaBanco (); CtaBanco (float, char, float); void SetSaldoActual (float); void SetTipoOp (char); void SetMonto (float); float GetSaldoActual (); char GetTipoOp (); float GetMonto (); float DetNvoSaldo (); }
El error que ves en la imagen se produce por la falta del punto y coma al final de la interfaz de la
clase CtaBanco.
Por cada error de compilación, el compilador de C++ produce varias líneas que explican el mismo. El panel inferior de la
I DE DevC++ muestra estos errores, te permite hacer doble clic en cada una y te lleva a la línea de código donde se produce el error.
Cuando compilas tu programa:• DevC++ revisa la sintaxis de
todos los archivos que conforman tu proyecto.
• La secuencia de comandos #include establece el orden de compilación.
• En ese mismo orden se muestran los errores.
• El compilador intentará identificar tantos errores como sea posible
METODOLOGÍA PARA CORREGIR ERRORES DE COMPILACIÓN CON DEVC++• Comience con el primer error mostrado, haga doble clic en él.• Debes aprender el significado del mensaje de error.• Lo mejor es resolver un error y volver a compilar.• Si cuando compilas identificas más de un error, entonces aprovecha y corrige
tantos errores como puedas.• Ya sabes que la ventanita con el mensaje “Done” te indica que ya tu programa es
sintácticamente correcto.
37
Metodología para el análisis y Programación Orientada a Objetos
Cuando hacemos un programa nos enfrentamos a la elaboración de un producto (en este caso un producto software), y por tanto es preciso cumplir una serie de etapas
de análisis y diseño que permitan el logro de los requerimientos por parte del cliente. Además, en la medida que se hacen cada vez más complejos los programas, el diseño preciso de la solución nos permitirán lograr más rápidamente la solución.
EJ EMPLO 1 DE APLI CACI ÓN DE METODOLOGÍ A
Planteamiento del problema
Programar con POO: Dado el saldo actual de una cuenta bancaria, el tipo de una nueva operación que se realizó y el monto de la misma, determinar el nuevo saldo de la cuenta.
Dado el saldo actual de una cuenta bancaria, el tipo de una nueva operación que se realizó y el monto de la misma, determinar el nuevo saldo de la cuenta.
1- Comprende: resalta las entidades que participan y
los datos que te dan; la clase final está subrayada
Si tengo 2000 Bs en el banco (saldo_actual) Las operaciones??? Retiro – depósito (tipo_op)
Ok!, si deposito 1000... (monto) Entonces tendré 3000 Bs (nvo_saldo)
Pero si retiro 1500 (monto)... me quedan 500 Bs Ta’ fácil: al saldo actual le sumo si es
deposito o le resto si es retiro (DetNvoSaldo)
2- Ejemplo: Este proceso de análisis te llevará a la solución fi nal. El cliente
puede decirte rápidamente si vas bien.
2- Abstracción: Este razonamiento es una excelente abstracción del problema
Los nombres de variables (en paréntesis) puedes idearlos una vez aprobado el ejemplo
CtaBanco
saldo_actual : float tipo_op : char monto : float
DetNvoSaldo () : fl oat
3- Clases: Observa que los componentes vienen desde el ejemplo: con el nombre
que ideaste!... si es dato de entrada, será atributo, los cálculos son métodos...
Recuerda que todos los métodos llevan paréntesis así no tengan argumentos.
38
Metodología para el análisis y Programación Orientada a Objetos
Con f recuencia te enf rentarás a planteamientos de problemas donde no están explícitos los datos de entrada ni los
requerimientos; algunos pueden estar implícitos (sobreentendidos), y otros tendrás que incluirlos ya que si no, no te funciona el modelo (la
ejemplificación). Deberás practicar mucho.
EJ EMPLO 2 DE APLI CACI ÓN DE METODOLOGÍ A
Programar con POO: Dado un número entero, determinar si el mismo es positivo o negativo.
Dado un número entero, determinar si el mismo es positivo o negativo.
1- Comprende: resalta las entidades que participan y los datos que te dan
El número 10 es positivo... 0 (cero) también... 2- Ejemplo: Este proceso de análisis te llevará a la solución final. El cliente
puede decirte rápidamente si vas bien.
2- Abstracción: Este razonamiento es una excelente abstracción del problema
NroEntero
valor : int
DetEsPositivo () : bool 3- Clases: Observa que los componentes vienen desde el ejemplo: con el nombre
que ideaste!... si es dato de entrada, será atributo, los cálculos son métodos...
Planteamiento del problema
Cómo saber si un valor es positivo???
Ya sé!! Si el número es mayor que cero, entonces es positivo (DetEsPositivo)
Nota que en el planteamiento sólo resaltaste número entero (la clase), el valor estaba implícito.
39
DEL EJ EMPLO Y ABSTRACCIÓN AL POO Abstracción en ¡Error! No se encuentra el origen de la referencia., pág. ¡Error!
Marcador no definido. I dentificación de objetos en ¡Error! No
se encuentra el origen de la referencia., pág. ¡Error! Marcador no definido.
La ejemplificación te da nombres de atributos y nombres de métodos
class CtaBanco { private: float saldo_actual; char tipo_op; // "D"=Depósito, "R"=Retiro float monto; public: :::::
:::::: float CtaBanco :: DetNvoSaldo (){ if (tipo_op == 'D') return saldo_actual + monto; else return saldo_actual - monto; }
La abstracción te lleva a la
implementación de los métodos
EJ EMPLO 1 DE POO (CARPETA PROY-CTABANCO)
CtaBanco :: CtaBanco (){ saldo_actual = 0; tipo_op = 'D'; monto = 0; } CtaBanco :: CtaBanco (float s, char t, float m){ saldo_actual = s; tipo_op = t; monto = m; } void CtaBanco :: SetSaldoActual (float s){ saldo_actual = s; } ::: // ACÁ VAN EL RESTO DE LOS GETs Y SETs float CtaBanco :: GetMonto (){ return monto; } float CtaBanco :: DetNvoSaldo (){ if (tipo_op == 'D') return saldo_actual + monto; else return saldo_actual - monto; }
#include <iostream> #include "CtaBanco.h" using namespace std; int main (){ float saldo, mto; char t_op; cout << "Introduzca el saldo actual: "; cin >> saldo; cout << "Tipo de operación "; cout << "(R=Retiro, D=Deposito): "; cin >> t_op; cout << "Introduzca el monto: "; cin >> mto; CtaBanco c (saldo, t_op, mto); cout << "El nuevo saldo de la cuenta es: "; cout << c.DetNvoSaldo () << endl; system("PAUSE"); }
#ifndef CTABANCO_H #define CTABANCO_H class CtaBanco { private: float saldo_actual; char tipo_op; // "D"=Depósito, "R"=Retiro float monto; public: CtaBanco (); CtaBanco (float, char, float); void SetSaldoActual (float); void SetTipoOp (char); void SetMonto (float); float GetSaldoActual (); char GetTipoOp (); float GetMonto (); float DetNvoSaldo (); }; #include "CtaBanco.cpp" #endif
I nterfaz de clase
CtaBanco (CtaBanco.h)
Este punto y coma es importantísimo!, si no, no compila!
I mplementación de clase CtaBanco (CtaBanco.cpp)
Programa Principal (Principal.cpp)
Programa en ejecución
40
EJ EMPLO 2 DE POO (CARPETA PROY-NROENTERO)
NroEntero :: NroEntero (){ valor = 0; } NroEntero :: NroEntero (int v){ valor = v; } void NroEntero :: SetValor (int v){ valor = v; } int NroEntero :: GetValor (){ return valor; } bool NroEntero :: DetEsPositivo (){ if (valor >= 0) return 1; else return 0; }
#include <iostream> #include "NroEntero.h" using namespace std; int main (){ int Nro; cout << "Introduzca el Nro entero: "; cin >> Nro; NroEntero n (Nro); if (n.DetEsPositivo ()) cout << "El numero es positivo." << endl; else cout << "El numero es negativo." << endl; system("PAUSE"); }
#ifndef NROENTERO_H #define NROENTERO_H class NroEntero { private: int valor; public: NroEntero (); NroEntero (int); void SetValor (int); int GetValor (); bool DetEsPositivo(); }; #include "NroEntero.cpp" #endif
NroEntero.h
Crear POO paso a paso en ¡Error! No se encuentra el
origen de la referencia., pág. ¡Error! Marcador
no definido. Este punto y coma es importantísimo!, si no, no compila!
NroEntero.cpp
Programa Principal (Principal.cpp)
Programa en ejecución
Llamada :: Llamada (){ tipo = 'L'; minutos = 0; } Llamada :: Llamada (char t, int m){ tipo = t; minutos = m; } float Llamada :: DetMtoServicio (){ if (tipo == 'L') return minutos * 0.1; else return minutos * 0.3; }
::: class Llamada { private: char tipo; int minutos; public: Llamada (); Llamada (char, int); // Se omiten Sets y Gets float DetMtoServicio (); }; ::::
#include <iostream> #include "Llamada.h" using namespace std; int main (){ int mins; char tipo; cout << "Tipo llamada (L=ocal, C=elular): "; cin >> tipo; cout << "Cantidad de minutos: "; cin >> mins; Llamada ll (tipo, mins); cout << "El monto del servicio es: "; cout << ll.DetMtoServicio () << endl; system("PAUSE"); }
EJ EMPLO 3 DE POO (CARPETA PROY-LLAMADA)
Llamada.h
Crear POO paso a paso en ¡Error! No se encuentra el
origen de la referencia., pág. ¡Error! Marcador
no definido.
Este punto y coma es importantísimo!, si no, no compila!
Llamada.cpp Programa Principal
(Principal.cpp)
Programa en ejecución
41
El número 10 es positivo... 0 (cero) también... Cómo saber si un valor es positivo???
Ya sé!! Si el número es mayor que cero, entonces es positivo (DetEsPositivo)
DEL EJ EMPLO Y ABSTRACCIÓN AL POO Abstracción en ¡Error! No se encuentra el origen de la referencia., pág. ¡Error!
Marcador no definido. I dentificación de objetos en ¡Error! No
se encuentra el origen de la referencia., pág. ¡Error! Marcador no definido.
La ejemplificación te da nombres de atributos y nombres de métodos
Si llama local 10 minutos son 1 Bs (tipo=L) Si llama celular 20 minutos son 6 Bs (tipo=C)
Condicionado al tipo (L - C) se multiplican los minutos por 0,1 ó 0,3 (DetMtoServicio)
class NroEntero { private: int valor; public: ::::::::
bool NroEntero :: DetEsPositivo (){ if (valor >= 0) return 1; else return 0; }
class Llamada { private: char tipo; int minutos; ::::::
float Llamada :: DetMtoServicio (){ if (tipo == 'L') return minutos * 0.1; else return minutos * 0.3; }
La abstracción te lleva a la
implementación de los métodos
42
LECTURAS OBLIGATORIAS
EN LA GUÍA DIDÁCTICA:• Estado de la memoria en una ejecución• Corridas en frío• Depuración de Programas• Sintaxis de comandos de Programación• Métricas de Programación: Legibilidad del
código• Entrada de datos desde archivos