100% encontró este documento útil (1 voto)
1K vistas48 páginas

C++ Programacion Orientada A Objetos

Libro Redusers de programación (muestra)
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
1K vistas48 páginas

C++ Programacion Orientada A Objetos

Libro Redusers de programación (muestra)
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 48
PROGRAMACION ORIENTADA A OBJETOS MOL tea) aN Che ale Tae) ty PREPROCESADOR, ARRAYS, FUNCIONES Y STRINGS DIAGRAMAS DE CLASES Y DE OBJETOS ata ee MURR Te Sa I) EW Ce Se a ey PT ae Ue Miers ied Cases TITULO: CH AUTOR: Diego Ruiz COLECCION: —— Manuales USERS FORMATO: 24x17 em PAGINAS: 352 Copyright © MMIXIV. Es una publicacién de Fox Andina en coedicién con DALAGA S.A. Hecho el depésito que marca la ley 11723. Todos los derechos reservados. Esta publicacidn no puede ser reproducida ni en todo ni en parte, por ningin medio actual o futuro sin ol permiso previo y por escrito de Fox Andina S.A. Su infraccidn esta perada por las eyes 11723 y 25446. La ecttorial ho asume responsabilidad alguna por cualquier consecuencia derivada de la fabricacién, funcionamiento y/o utlizacion de los servicios y productos que se descniben y/o analizan. Todas las marcas mencianadas en este libro son propiedad exclusiva de sus respectivos duefios. impreso en Argentina, Libro de edicion argentina, Primera impresién realizada en Sevagrat, Costa fica 5226, Grand Bourg, Malvinas Argentinas, Pola. de Buenos Aires en Vil, MMUXIV. ISBN 978-987-1949-64-9 Ruiz, Diego C++ /Diego Ruiz ; coordinado por Gustava Carballeio - 1a ed. - Ciudad Auténoma de Buenos Aires: Fox Andina; Buenos Aires: Dalaga, 2014. 352 p. ; 24x17 cm. - (Manual users; 268) ISBN 978-987-1949-64-9 1. Informatica. |. Carballeiro, Gustavo, coord. I. Titulo ep 008.3 4 SS PRELIMINARES El libro de un vistazo En este libro abarcaremos los principales temas que componen la pro- gramaci6n orientada a objetos con C++: cuales son sus caracteristicas y como se utilizan sus funciones. El contenido de cada capitulo es eminente- mente tedrico, acompafiado siempre de diagramas y consejos practicos. wed ele eRe Resa En este primer capitulo abordaremos los conceptos principales que hacen a la programacién orientada a objetos y haremos tuna introduccién a los sistemas complejos. *a vc FUNDAMENTOS DE C++ Estudiaremos los elementos que componen este lenguaje de programacién y conoceremos sus principales virtudes. *O “ee ASPECTOS AVANZADOS DEL LENGUAJE ‘Aprenderemos a interactuar con el usuario, ‘veremos qué es un array y como emplearlo, yy comenzaremos @ trabajar con variables que contengan texto. Ademés, explicaremos como crear nuestras propias funciones. a aa 4 CLASE Y OBJETO En este capitulo profundizaremos aspectos del lenguaje estudiando, basicamente, una de sus estructuras principales: la clase. >> www.redusers.com *q “ve fee aa eae Descubriremos como solicitar memoria desde un programa en forma dinémica por medio de los punteros, para hacer ln uso més eficiente de los recursos de la computadora. Veremos también qué son las referencias. * vee En este capitulo abordaremos herencia y composicion, dos recursos fundamentales en el momento de ctear el modelo de datos de nuestro sistema. Veremios como trabajan los constructores y destructores y crearemos una pila y una cola utilizando un array. *O “ee eae Estudiaremos el polimorfismo, tercer gran pilar de la programacién orientada a objetos. También veremos mecanismos que implementa el lenguaje para dar soporte a esta caracteristica: la sobrecarga de funciones y operadores, los métodos virtuales y las clases abstractas *n¢g Yeu esta formado por una serie de diagramas CaaCa ee) ‘que nos ayudarén a disefiar y documentar los \Veremos cémo trabajar con los recursos que diferentes componentes del sistema. ofrece C+-+ para la manipulacién de archivos: escritura y lectura de datos binarios, y cudles son los pasos a seguir para almacenar el estado de un objeto en y desde un archivo. ES Man sony wer ec} Saar NUIT) Aprenderemos a implementar una lista Mee ee una pila dindmica y una cola dindmica. Los patrones de disefio son soluciones Finalmente, aprenderemos a reimplementar documentadas a problemas cldsicos todas estas estructuras, pero de modo surgidos en la construccién de sistemas independiente del tipo de dato que manejen, orientados a objetos. En este capitulo, por medio de las plantillas. veremos algunos de los patrones mas opulares que podremos aplicar. populares que p ol *A wew * 2 oft LLL alibreria STL es un poderoso aliado a la Peco ae eed hora de codificar sistemas que requieran Este sistema de notaciones esté destinado estructuras de datos, como arrays, listas, al modelado de aplicaciones que se pilas, colas y mapas. En este capitulo basan, principalmente, en conceptos de la veremos cémo hacer uso de ella y, asi, programacion orientada a objetos. Este sistema mejorar nuestra productividad. NAVEL la asl aA EL ‘Alo largo de este manual podré encontrar una serie de recuadros que le brindaran informacion complementaria: curiosidades, trucos, ideas y consejos sobre os temas tratados. Para que pueda dstinguirlos en forma mas sencil cada recuadto esta identiicad con diferentes iconos: ‘CURIOSIDADES ATENCION DATOS UTILES siTios WEB, EIDEAS ‘YNOVEDADES wwwredusers.com <¢ 6 Contenido El libro de un vistazc Informacion complementaria. Introdueci6n. Programacion orientada a objetos Introduecion Programacién no estructurada Programacién procedural Programacién modular Programacién orientada a objetos. {Qué es un objeto? Mas caracteristicas de los objetos ‘Ain ms caracteristicas de los objeto El andliss y el disefo en la programacion otlentada a objetos... El lenguaje unificado de modelado Resumen .. Actividades... Entrada video >> www.redusers.com PRELIMINARES Fundamentos de C++ 2Qué es un enguaje de programacion 30 Proceso de compilacién 30 Proceso de enlace a Entornos de programaci6 n.ensonsnnnnn SL Un poco de histori 32 Diferencias entre ¢ y C+... ‘Nuestro primer programa en C44. Comentarios. Variables. Asignacién. sentencia Constantes. ‘Tipos de datos fundamentales Nameros enteros... Nameros no enteros El operador sizeof AS Caracteres. Ab El tipo de dato void... “AT Booleanos, a7 Operadores. Precedencia de operadores. a9 CH Control del fluo ce ejecucién. Sentencias condicionales.. Sentencia de buck . Resumen Actividades... Aspectos avanzados del lenguaje Entrada y salida en C4. El objeto cout. El objeto cin El preprocesador Array Funciones.. Funciones que retornan valores... Funciones con pardmetros Arquitectura de un programa complejo. Los string en C44, Funciones para la manipulacién de estrings Estructuras.. Uso de una estructura Enumeradores.. Enumeradores sin valor numérico asociado. Fijando un valor inicial Resumen... Actividades .. Clase y objeto Lactase Las funciones miembros 0 métados 137 El diagrama de clases. El diagrama de objetos El constructor... El destructor. Modificadores de acceso.. Propiedades estaticas.. Métodos estaticos. Restricciones de los métods estaticos... El juego de ta vida. Laresolucon... La propiedad... Los métodos La funcion main... Patrones de interes Resumen Actividade: Class Foo c protected: } } ms} } private: u. wwwredusers.com <¢ 8 BSS Gesti6n de memoria Los punteros. (Como declarar una variable tipo puntero. 15s El operador new... 178 Operador delete. 78 Punteros a array... a79 Cadenas de texto. 184 Aritmética de punteros. 186 Las referencias... am Los punteros como parmetros de funciones 192 Los punteros com valor de retorno... 198 Variables estatcas... 201 Puntero a objetes.... Las propiedades Usilizar la clase Cadena, El constructor de copia, Array de objetos. El puntero thi Resumen . Actividades taegacactt i a | | ‘nERROR La spleen sora nerir even secon >> www.redusers.com PRELIMINARES Herencia {Qué es la herenek 220 Método inline. zal Métodos corstantes. 23 Crear subclass... 28 Moslfcadores de acceso en la herent ne ronn225 227 e233 oe) | madifcador de acceso protected. Invocacién de construtores... Invocacion de destructores 5, Extraigo un elemento, Extraemos el ditimo | clomentoqueingress | [____] [51 6 3 5 4 3 ‘enlapila. 1 iUtinetomeato Lo Constructores con pardmetros.. Composicién. Ocultar el nombre de un método. Composicién vs. Herencia Herencia mialtiple . El caso del diamante: Caso de estudio Como funciona una pila Como funciona una cola. Declaracion de la clase Array. 251 Definicion de la clase Array. sn 252 Declaracion de la clase Pila 255 Definicion de la clase Pila 256 Declaracion de la clase Cola, 258 CH Defiicion de la clas€ CO, annsnsnennninnsen 29 Usar la pila y la cola Resumen... Actividades... Polimorfismo {Qué es el pollmortismo? Sobrecarga de funciones. Pardametrs opcionales Sobrecarga de operadores El modificador friend... ‘Sobrecarga de operadores unarios Operadores que no modifcan €l estado del obj€t0 enn Operadores que modifican el estado del objeto...263 Sobrecarga de operadores binarios Métodos virtuales Destructores virtuales. Resumen . Acti Objetos persistentes Qué es un objeto persistente’ Manejo de archivos en C+. Escritura de un archivo Lectura de un archivo. Lectura y escrtura de datos binaris ‘Almacenar el estado de un objeto. Objetos con punteros... Resumen Actividades 4. Formadh snob open arin lacie \ sjomplo.t (2b) 2. Lume da cans erate cari ya leas nin bot moma, ‘Buf (memoria) ceremonies (Bieta) Patrones de disefio {Qué es un patron de disefo?.. 328 El patron Singleton.. 38 El patron Método Plantil 330 El patron Fabriea.. 332 El patron Estrategia 334 El patrén Observador.. 337 340 wwwredusers.com <¢ lO GSS Lenguaje Unificado de Modelado Introduecién. Diagramas de Casos de us Diagramas de Clases. Diagramas de Objeto: Diagramas de Secuencia. Diagramas de Estados Diagramas de Colaboracién .. Diagramas de Actividad. Diagramas de Componentes Estructuras de datos dinamicas y plantillas Listas enlazada {EQuE es una lista enlazade?... Implementacién de lista enlazada. La clase Nod La clase Lista >> www.redusers.com PRELIMINARES == monn st KOH Listas doblemente enlazadas.. Pia. Cola. Plantilas.. Listas doblemente enlazadas con plantilas. Pita Actividades... La libreria de plantillas STL La libreria STL... Las clases contenedoras. La clase vector. La clase lis... La clase stack, La clase queue La clase map. 10 2 GSS PRELIMINARES Introduccion » Este libro esta dirigido principalmente al programador novato y de nivel medio, asi como al estudiante o al autodidacta. Los primeros cuatro capitulos son introductorios, y alli explicaremos detalladamente cudles son los fundamentos del lenguaje, su sintaxis y sus sentencias basicas. También veremos como realizar nuestro primer programa. Llegando a la mitad del libro profundizaremos los conceptos relacionados con la programacion orientada a objetos. Descubriremos, qué es un objeto cuando hablamos de C++ y como tratar con él. Si usted es estudiante del nivel terciario 0 universitario de alguna carrera relacionada con la programacién, seguramente encontraré muy util el capitulo 5, en el que se explican algunos conceptos mas avanzados, como la gestion dinamica de la memoria. Por otro lado, si es un programador practico, tal vez desee utilizar las estructuras de datos de la libreria STL; en el apéndice C veremos en detalle como emplearla. Entre otros temas, descubriremos qué es un iterador, qué es un contenedor y como hacer uso de ellos. Finaltzado el libro, sera capaz de crear sus propias aplicaciones C++ haciendo uso de las herramientas de disefio adecuadas. Con los conceptos aprendidos y los ejemplos vistos, estara preparado para comenzar a experimentar y realizar diversos proyectos. ‘Todos los temas son tratados a través de diagramas visuales y ejemplos practicos, en busqueda de facilitar la comprension de los conceptos. >> www.redusers.com WN Programacion orientada a objetos En este primer capitulo, comenzaremos por conocer qué es la programacion orientada a objetos y en qué puede ayudarnos. También veremos sus conceptos principales, la evolucién del disefio y una introduccién a la construccién de sistemas complejos. 14 + Elanilisis y el disefio en la oS + Introduccién Programacién no estructurada...... 15 programacién orientada Programacion procedural once 15 a objetos. Programacion moda cone 16 El lenguaje unificado Programacién orientada a objetos... 16 ‘de modelado Qué es un objeto?, Mas caracteristicas de los objetos. ‘Aiin mas caracteristicas de los objetos. 20 Actividades. + Resumen. AAA 4 Gea 1, PROGRAMACION ORIENTADA A OBJETOS ) Introduccién Queremos utilizar la computadora para resolver problemas, ino es asi? Podria ser un problema propuesto por un profesor de la facultad en un enunciado, el calculo del saldo de una cuenta bancaria o la programacién de un juego. El asunto es que para esto deberemos trasladar dichos problemas a nuestra PC, y este proceso de traslacién implica una abstraccién. Tal vez el término resulte extrafio, pero desde nifios estamos acostumbrados a realizar abstracciones: en aquellos tiempos, a veces jugébamos a ser otra persona situada en otro mundo; incluso la bafiera podia convertirse en un mar embravecido. Tales ejemplos no son otra cosa que abstracciones, modelos de una realidad Ilevada a otro contexto por medio de una operaci6n intelectual. Como deciamos, para trasladar un problema a la PC, también realizamos abstracciones; 0 sea, debemos crear un modelo simplificado de la realidad tomando los elementos que nos parezcan pertinentes y transformandolos en variables, por ejemplo, dentro de un programa. De este modo, nuestra maquina podra entenderlo, ejecutarlo y, finalmente, habremos obtenido el resultado que estébamos buscando. Problema ——+ Figura 1. Para introducir un problema en una computadora, debemos realizar un proceso de abstraccion. Para esto, sin duda, deberemos acudir a un lenguaje de programacién, que no es otra cosa que una herramienta. El lenguaje nos permitira especificar, a modo de instrucciones, cuales son los pasos que tendra que seguir la computadora para resolver el problema. Pero cémo especifiquemos la solucin dependera del modelo de programacién que utilicemos. Entonces, lo mejor sera repasar un poco los modelos mas comunes. >> www.redusers.com CH 15 Programacion no estructurada Si no estamos empleando ningdn modelo de programacién en particular, probablemente estemos programando de modo no estructurado. La programacién no estructurada consiste en un programa extenso desarrollado dentro de una funcién principal que utiliza ¥ solo variables del tipo global. Este modo de programaci6n puede ser aceptable para la oa resolucién de problemas triviales; sin embargo, a medida que la complejidad se incrementa, comienza a ser muy engorroso su mantenimiento y el agregado de nuevas caracteristicas. LI Figura 2. En la programacién no estructurada es dificil seguir el flujo de ejecucion. Programaci6n procedural La mayor parte de los lenguajes de alto nivel soportan la creacion de procedimientos, que son trozos de cédigo que realizan una tarea determinada. Un procedimiento podra ser invocado muchas veces desde otras partes del programa con el fin de aislar la tarea en cuestion y, una vez que finaliza su ejecucién, retorna al punto del programa desde donde se realizé la llamada. Ademas, cada procedimiento tendra su propio conjunto de datos, aunque podra acceder a datos globales y a los pasados como parametros desde el programa principal o desde otros procedimientos. De esta forma, podemos dividir nuestro problema en problemas mas pequeiios y, asi, llevar la complejidad a un nivel manejable. T igura 3. Programacién procedural en programas pequefios 0 medianos. Programa principal _ | 2 cy wwwredusers.com — <« 16 1, PROGRAMACION ORIENTADA A OBJETOS ‘programa principal pL p2. Figura 4. Programacién procedural en un programa de tamaiio mayor. Programaciéon modular La programacién modular va un paso més alla con la creacién de procedimientos: los agrupa en médulos segiin su funcién. De esta manera, el modelo es apto para sistemas mas complejos que requieren programas més extensos. Cada médulo tendra su propio conjunto de datos, creando un nivel intermedio de datos globales, ya que el conjunto de datos del médulo sera global para los procedimientos del médulo, pero inaccesible a los rograma principal procedimientos de otros médulos. De este modo, la representacion de un determinado concepto del problema podra ser levado a un médulo; por ejemplo, pi ps Z ; tt TY la manipulacién de archivos, donde dentro a del médulo en cuestién existiran distintas Tt funciones para su creacién, destruccién, pe lectura, escritura, etcétera. Médulo 1 Médulo 2 Figura 5. En la programacién modular, cada médulo agrupa procedimientos. Programacion orientada a objetos En la programaci6n orientada a objetos, el concepto de médulo es profundizado y se transforma en un objeto. Ademés, alli, un programa >> www.redusers.com WN En este capitulo haremos una introducci6n al lenguaje C++, expondremos sus principales virtudes, estudiaremos los elementos que lo componen y cémo crear programas con él. + 2Qué es un lenguaje de PrOgrAMACIGN? sun Proceso de compilacién .. Proceso de enlace. Entornos de programac Un poco de historia Diferencias entre C y C+. Primer programa en C++ Comentarios + Variables. Las palabras reservadas de C++... y Asignacién. +» Constantes. y Tipos de datos fundamentales.. Nimeros enteros. Némeros no enteros. El operador sizeof Caracteres. El tipo de dato void.. Booleanos. vy Operadores... Precedencia de operadores.. Control del flujo de ejecuci6n.51 Sentencias con Sentencia de buck Resumen. + Actividades. oS AAA 30 2, FUNDAMENTOS DE C++ a Qué es un lenguaje de programacion? Un lenguaje de programacién es, principalmente, una herramienta. Por medio de él podremos indicarle a nuestra computadora qué pasos debe seguir para resolver un determinado problema, Estos lenguajes suelen ser clasificados segiin distintos criterios; uno de ellos es su cercania al lenguaje realmente comprendido por la plataforma. Los lenguajes de bajo nivel son los mas cercanos a la arquitectura de la computadora, y el ensamblador es uno de ellos. Por otro lado, los lenguajes de alto nivel utilizan sentencias similares al lenguaje natural empleado por los seres humanos; de este modo, son mas faciles de aprender y, ademas, pueden ser trasladados a distintas arquitecturas por no poseer un cédigo intimamente relacionado con estas. En este grupo se encuentra la mayor parte de los lenguajes, como el C, C++, Pascal, Fortran, Basic, etcétera. Proceso de compilacion Ahora bien, tal vez nos preguntemos cémo es que si programamos utilizando sentencias en lenguaje similar al natural, en cualquiera de los lenguajes conocidos, la maquina puede entenderlo, Para esto, existe un proceso mediante el cual se traduce dicho cédigo a un lenguaje entendible por la computadora. Proceso de compilacién [archive main-opp [archivo mainobj_ Taahive dos op “archive doa “archivo re.cpp | ~j [archive tes abf Testo progama Figura 1. Un proyecto esta formado por un grupo de archivos de cédigo. Cada archivo de cédigo se compila de manera individual. >> www.redusers.com CH 31 Aste proceso se lo denomina compilacién, y los programas que lo realizan se denominan compiladores. Normalmente cuando nuestro programa crece en cantidad de lineas, el proyecto suele ser dividido en diversos archivos de cédigo. Proceso de enlace Luego, terminado el proceso de compilacion, habremos obtenido una serie de archivos (con terminacién obj) que deberemos juntar para crear un archivo ejecutable. E] proceso que une estos archivos y les adjunta ademas otros componentes, segtin corresponda, se denomina enlace, y el programa que realiza esta funcién es el enlazador. £1 archivo de salida a este es un proceso ejecutable. Proceso de complacién Proceso de enlazado ve al [archive doscpp_}-~ _ATohivO tros.¢pp Compilador C++ Eniazador Figura 2. Procesos de compilacién y enlace. Entornos de programacion Parece complicado.. progré y luego enlazar? ¢Como hacemos todo esto? Bueno, podriamos decir que somos afortunados: en la actualidad existen muchos entornos de desarrollo donde todos estos procesos se realizan mediante un simple golpe de tecla. La eleccién de qué entorno utilizar se deja a criterio del lector. Sin embargo, en el Apéndice B se recomiendan algunos de los mas populares para el sistema operativo Microsoft Windows. wwwredusers.com — <« 32 CaaS 2. FUNDAMENTOS DE C++ Es importante hacer la distincién entre un entorno de desarrollo y un compilador: el entorno es simplemente una aplicacién -usualmente, de ventanas- que nos permite gestionar un proyecto de programacién de manera sencilla; el entorno de desarrollo, por su parte, utiliza el compilador y el enlazador automaticamente. Ademis, los entornos modernos colorean distintas palabras de nuestro cédigo en funcion de las sentencias reconocidas del lenguaje, y esto mejora muchisimo la legibilidad del cédigo. Y existen otras tantas funciones mas que realiza el entorno para facilitarnos la vida, como ser: © Permitir la configuracién de los parametros del compilador y el enlazador de manera sencilla. « Mostrar el nombre de las estructuras de datos empleadas en nuestro proyecto para poder acceder a ellas facilmente. * Facilidades de busqueda avanzada. © Facilidades de impresién. * Muchos entornos incluyen un depurador integrador para realizar un seguimiento paso a paso de la ejecucién de nuestro programa. 2) Un poco de historia El lenguaje C fue desarrollado en los laboratorios Bell durante la década del 70, y proviene de otro lenguaje llamado B, que a su vez desciende de otro lenguaje llamado BCPL. Inicialmente, el lenguaje C fue desarrollado como un lenguaje de programacién para escribir y mantener el sistema operativo UNIX, luego fue expandido para trabajar en otros sistemas. A medida que el lenguaje crecié y maduré fue tornandose mas popular. Actualmente, sus principales caracteristicas son: eae aL Esta division se realiza con la intencién de disminuir la complejidad en la organizacién de nuestro proyecto. Cada uno de estos archivos de cédigo es compilado de manera individual. >> www.redusers.com WN Aspectos avanzados del lenguaje En este capitulo, aprenderemos a interactuar con el usuario por medio de una terminal de texto. Veremos también qué es un array, comenzaremos a trabajar con variables que contengan texto y crearemos nuestras propias funciones. Funciones para la manipulacién y 3 de strings. y Entrada y salida en C++. El objeto cout. El objeto cin... + Estructuras Uso de una estructr + El preprocesador. y Array. y Enumeradores. Enumeradores sin valor numéri Funciones.. 91 asociado.... - 128 Funciones que retornan valores.....93, Fijando un valor inicial...enne 130 Funciones con parametro. 4 Arquitectura de un programa Resumen, complejo... v Actividade: Los string en C+ AAA 74 3. ASPECTOS AVANZADOS DEL LENGUAJE ») Entrada y salida en C++ El lenguaje C++, al igual que el lenguaje C, no incluye primitivas para realizar opciones de entrada/salida. En su lugar, existen librerias estandar que nos permiten, por ejemplo, escribir en la pantalla o tomar un caracter del teclado, es decir, manipular los flujos de entrada/salida a nuestro gusto, Un flujo (en inglés, stream) no es otra cosa que una secuencia de bytes que provienen de una fuente (flujos de entrada) o van hacia algiin destino (flujos de salida). Al utilizar este concepto, C+ se desvincula de cual sea la fuente o el destino concreto; un flujo de salida podria ser la pantalla 0 un archivo, y todo se manejaria basicamente del mismo modo. El lenguaje C define inicialmente tres flujos estandar: * stdin, el flujo de entrada (conectado por defecto a la entrada del teclado); © stdout, el flujo de salida (conectado por defecto a la pantalla de la terminal); © stderr, un flujo de error (también conectado por defecto a la pantalla de la terminal). ftujos de salida “archivo Figura 1. Flujos de entrada/salida en un programa C++. El lenguaje C++ hereda estos conceptos de C y agrega los siguientes tres objetos globales para manipularlos: © El objeto cin, para manipular el flujo stdin. © El objeto cout, para manipular el flujo stdout. © El objeto cert, para manipular el flujo stderr. Para poder utilizar estos objetos, bastaré con que incluyamos el archivo de cabecera iostream del siguiente modo: >> www.redusers.com CH 75 include Ademés, estos objetos, por estar definidos dentro del conjunto de datos estandar del lenguaje, se encuentran bajo el espacio de nombre std (abreviacién de “estandar’). Por lo tanto, siempre debemos anteponer stds: a su uso. Por ejemplo: std::cout << "el texto va aqui”; En lugar de anteponer siempre std, también podemos especificarlo al comienzo del programa: using namespace std; Pero... gqué es un espacio de nombre? Dentro de una libreria, existe una gran cantidad de declaraciones que especifican identificadores para cada tipo de dato. Qué sucederia si utilizéramos un nombre ya existente en una libreria para un tipo de dato creado por nosotros? El compilador arrojaria un error, por lo que nosotros deberiamos cambiar el nombre de nuestro tipo de dato. {Qué sucederia si desearamos utilizar dos librerias que declarasen dos identificadores con el mismo nombre? En ese caso, modificar el cédigo seria muy trabajoso, ya que dicha libreria no fue escrita por nosotros. ‘A modo de analogia, el lector podria pensar qué sucederia si el sistema de archivos utilizado por su sistema operativo no permitiera la creacién de subdirectorios, es decir, si todos y cada uno de los archivos que contuviera su disco duro debiesen estar en el directorio raiz. Seria un problema tener que estar renombrando archivos para que no existan dos con el mismo nombre! Un espacio de nombre (en inglés, namespace) en C+ seria equivalente a un directorio en un sistema de archivos. Asi como pueden existir dos archivos con el mismo nombre dentro de dos directorios distintos, pueden existir dos identificadores iguales en distintos espacios de nombres. wwwredusers.com — <« 76 3. ASPECTOS AVANZADOS DEL LENGUAJE Para declarar una variable dentro de un espacio de nombres en. particular, simplemente debemos proceder del siguiente modo: namespace MiEspacioDeNombre « int iMiVariable, Por lo tanto, el siguiente listado de cédigo es incorrecto: int iValor; int iValor; Pero el siguiente no: namespace Ns1 ‘ int Valor; ) namespace Ns2 ‘ int iValor; Ahora bien, si queremos utilizar la variable declarada dentro de nuestro programa, tendremos que especificar el espacio de nombre al cual deseamos referirnos; de otro modo, el compilador sélo buscara el identificador en el espacio de nombres global. namespace Ns1 ( int Valor; ) namespace Ns2 >> www.redusers.com WN Clase y objeto Ya hemos realizado una introduccién al lenguaje; ahora comenzaremos a ver temas relacionados especificamente con la programacién orientada a objetos. Profundizaremos aspectos del lenguaje C++ a partir del estudio de una de sus estructuras principales: la clase. y La clase... 134» Métodos estaticos Las funciones miembros 0 métodos 137 Restricciones de los métocios estaticos El diagrama de clases... El juego de la vida... y El diagrama de objetos. Laresolucién... 158 La propiedad... 158 + El constructor Los MBtOd0S..an 159 La funcién mai El destructor. Patrones de interés.. ¥ Modificadores de acceso... Resume + Propiedades estaticas + Actividades AAA 14 GSS CLASE Y OBJETO +) La clase Una clase es una estructura de datos. Su objetivo, como el de la estructura (struct), es crear nuevos tipos de datos para ser utilizados en un programa. De hecho, la estructura posee muchisimas similitudes con las clases, especialmente en C++. Recordemos que una estructura nos permite manejar un conjunto de datos como un elemento tinico. Esto es especialmente itil cuando el conjunto de datos posee una estricta relacién entre si y conforma una entidad. En el capitulo anterior, vimos el ejemplo de un automévil en el que colocamos unas cuantas propiedades relacionadas con él dentro de una estructura Una clase nos permite ir un paso mas alla; no solo podremos declarar tipos nuevos especificando sus propiedades, sino que podremos incluir funciones que, por supuesto, también estaran muy relacionadas con la entidad en cuestién. Supongamos que deseamos implementar una aplicacién en la cual requerimos modelar el concepto de un televisor. Para ello, consideraremos algunas de sus propiedades y estableceremos como regla que las propiedades de sintonia (m_uiCanal) y nivel de sonido (m_uiVolumen) solo deberian poder modificarse cuando el televisor esté encendido (m_bEncendido en verdadero). struct Televisor 4 bool m_bEncendido; 1/ Indica si la TV esta encendida unsigned int m_uiCanal; —_// Indica sintonia del televisor unsigned int m_uiVolumen; // Indica nivel de sonido Ahora, si desearamos crear un televisor en nuestra aplicacién, deberiamos crear una variable a partir de él del siguiente modo: int main ‘ Televisor tvl; >> www.redusers.com CH CaS5 135 Wess Siguiendo con el ejemplo, si nuestra intencién es cambiar el valor de la propiedad m_uiVolumen, bastaria con escribir: tv1.m_uiVolumen = 10; Pero esto no siempre podra ser correcto. Habiamos establecido que el nivel del sonido podria ser modificado cuando el televisor estuviera encendido, por lo tanto, tendriamos que haber codificado: if (tvl.m_bEncendido) tv.m_uiVolumen = Entonces, el hecho de que el programador modifique el nivel de sonido cuando el televisor esté apagado queda bajo estricta responsabilidad. Es esto lo que queremos? Pues no. Lo ideal seria poder establecer ciertas reglas en una entidad y que de ningun modo otro programador pudiera alterarlas; en definitiva, algo mas parecido aun televisor real, es decir, si no se puede variar el nivel de sonido cuando el aparato se encuentra apagado, como usuarios, nada podemos hacer mas que obedecer las reglas. Como una alternativa encaminada a subsanar este problema, podriamos crear una funcién que modificara el nivel de sonido del aparato, que retorne verdadero si lo ha podido hacer y falso de otro modo: cd a ac dciabctbth ncaa Como se puede ver en la funcién ModifiarVolumen, para el parametro Televisor hemos utlizado Una referencia en lugar de hacer un pase por valor. Esto es corveniente por dos motives: Deseamos modificar el objeto original yno una copia que seré finalmente destruida Pasar una direccién de memoria es mas efciente que copiar las propiedades de una estructura wwwredusers.com — <« 136 4, CLASE Y OBJETO bool ModificarVolumen(Televisor & tv, unsigned int uiVolumen) « if (tv.m_bEncendido) q tv.m_uiVolumen = uiVolumen; return true; } else return false; y Entonces, ahora podriamos utilizar esta funcién de la siguiente manera: int main 4 Televisor tv1; 11 Modifico el nivel de sonido de tv ModificarVolumenttv1, 10); return 0; Es necesario hacer el pase de tvl, ya que podriamos poseer varios objetos del tipo Televisor, y la funci n requiere saber a qué estructura debe modificar sus datos. De modo andlogo, podriamos crear otras funciones relacionadas con el televisor: void Encender(Televisor & tv) 4 Tv.m_bEncendido = tue; void Apagar(Televisor & tv) ‘ >> www.redusers.com WN Gestion de memoria En este capitulo veremos como solicitar memoria en forma dinamica por medio de los punteros. De esta manera podremos crear objetos dinamicamente y hacer uso mas eficiente de los recursos de la computadora. Veremos también qué son las referencias y cuando es conveniente utilizarlas sobre los punteros. y Los punteros Como declarar tna variable tipo puntero. El operador new Operador delete oem Punteros a array. Cadenas de texto ‘Aritmética de punteros Las referencias. Los punteros como parémetros de FUNCIONES .enrninennennaee 9B Los punteros como valor CS SC Variables est€tieas...oennnnnn201 vy Puntero a objeto: Las propiedade: Uilizar la clase Caden: El constructor de cop vy Array de ObjetOS en y El puntero this + Actividades us AAA 14 GSS 5. GESTION DE MEMORIA ») Los punteros Si alguna vez escuchamos hablar de punteros, seguramente la frase fue acompafiada de la palabra “dificil”. Sin embargo, no tiene por qué ser asi. Un puntero es basicamente una construccién del lenguaje que nos permite obtener mas control de la memoria de la computadora Con él podemos crear objetos en forma dindmica y asi utilizar eficientemente los recursos del sistema. ‘Supongamos que deseamos almacenar una cierta cantidad de notas de un alumno en alguna estructura de datos. Si bien ya estudiamos este mismo ejemplo cuando vimos los array, ahora agregaremos un condimento extra: la cantidad total de notas de un alumno s6lo se conoce cuando comienza a ejecutarse el programa, y puede variar de ejecucion a ejecucién. Antes, bastaba con crear un array de una determinada cantidad de elementos y listo, pero ahora, qué haremos? Una solucién posible seria crear un array absurdamente grande para que se puedan almacenar todas las notas que sean necesarias en cualquier caso. M1 Creo un array de un tamafo suficientemente grande int aiNotast10001; Pero esta solucin tiene dos defectos: * En algunos casos, podria no existir un maximo posible, es decir, la cantidad de elementos es realmente desconocida y puede ser tanto 5 como 250 o 100 000. © Realizamos un uso muy poco eficiente de los recursos. Si, por ejemplo, creamos un array de 1000 elementos y luego usamos tan solo 10, estaremos desaprovechando muchisima memoria. Una solucién que podriamos imaginar seria crear un array de tamafio especificable durante el tiempo de ejecucién. De todas maneras, el compilador exige que el valor encerrado entre corchetes en la definicion de un array sea una expresidn constante, es decir, un valor conocido en tiempo de compilacién. Por esa razén no se permite el siguiente cédigo: >> www.redusers.com CH 175 int iTamArray; cout << “Ingrese el tamajio del array: "; cin >> iTamArray; cout << endl; i! La siguiente expresién es INVALIDA, iTamArray no es una expresién constante int aiNotastiTamArray]; i Sigo trabajando con aiNotas Haass Como excepcién a la regla, el compilador gee 3.2 si acepta el cédigo anterior. Para poder crear un array en el que su tamafo sea especificado en tiempo de ejecucion, tendremos que solicitar memoria en forma dinamica utilizando punteros. Un puntero es una variable que no almacena directamente un dato, sino una direccién de memoria en la que se encuentra el dato en cuestién. Como declarar una variable tipo puntero Supongamos que deseamos crear una variable puntero; para ello, deberemos especificar, como con cualquier otra variable, cual es su tipo. Veamos: // Una variable puntero a un nimero entero int * pA; Notemos que la declaracion es muy similar a Ja de una variable convencional, solo que aqui, por ser un puntero, colocamos un signo asterisco (*) entre el tipo de dato y el identificador. pA es, entonces, una variable que contendra una direccién de memoria donde habra un niimero entero. Sin embargo, zen qué posicion estara el niimero entero? Adin no lo hemos determinado, simplemente existe el contenedor de la direccién, pero todavia no se establecié qué wwwredusers.com — <« 176 5. GESTION DE MEMORIA direccién sera; el puntero, como cualquier otra variable, comienza con un valor basura en su interior Figura 1, Un puntero aun no inicializado, Si en nuestro programa existiese otra variable entera, podriamos establecer que nuestro puntero apuntara a ella del siguiente modo: 11 Declaro una variable entera convencional y la inicializo en 10 int 1UnaVariableEntera = 10; #7 Declaro un puntero a variable entera int * pA; // Ahora le asigno la direcci6n de memoria donde se encuentra iUnaVariableEntera Mal puntero pA pA = & iUnaVariableEntera; TUnaVariableEntera (OxFFFFO102) pA (OxFFFFO101) [OXFFFFOI02 Figura 2. El contenido de la variable sera un valor, y el contenido del puntero sera una direccién de memoria. Notemos que, para obtener la direccion de memoria que le fue asignada a la variable entera iUnaVariableEntera, utilizamos el operador & ("direccién de"). Ahora es posible modificar el valor de la variable entera no solo por medio de ella, sino también por medio del puntero. Para esto, no deberemos hacer lo siguiente: >> www.redusers.com ESO Herencia En este capitulo abordaremos herencia y composici6n, recursos fundamentales en el momento de crear el modelo de datos de nuestro sistema, Veremos cémo trabajan los constructores y destructores dentro del mecanismo de herencia y crearemos una pila y una cola utilizando un array. « |&s + {Qué es la herencia’ y Herencia maltiple ‘Metods inline. El caso del diamante 203 (Métodos constantes. Crear subclases. + Caso de estudio, Modificatores de acceso Como funciona una pil en la herencia 225 CCémo funciona una cola 1206 | madifcador de acceso protected 227 Declaracion de la clase Array... 251 Invocaci6n de constructores Defnicion de la clase Array Declaracion de la clase Pila. Invocacton de destructores.. Constructores con parémetros. Defnicin de la clase Pla Declaracion dela clase Cola.....258 Defnicin de la clase Cola 259 262 Usar la play la cola. + Ocultar el nombre de un métado... 263, + Composicion vs. herencia. AAA 2200 Gea 6. HERENCIA al éQué es la herencia? 1a herencia es un concepto fundamental de la programacién orientada a objetos. Por medio de esta caracteristica podremos definir nuestras clases a partir de otras mas generales y solo agregar las. propiedades y métodos de la especializacion. En el Capitulo 1 habiamos hecho una introduccién a este tema. Habiamos comentado que el modo en que funcionaba la herencia tenia mucho que ver con la forma en que definimos elementos empleando la tradicion aristotélica, es decir, nos basamos en un objeto conocido para luego especificar las diferencias que dan origen al nuevo elemento. Debido a que nuestro sistema sera una coleccién de clases relacionadas entre si, es muy importante ver como estard confirmada su estructura. Por lo general, un disefto pobre genera mas problemas que soluciones, ya que los errores se propagan rapidamente y se torna mas dificil su expansion y mantenimiento. Volvamos al ejemplo de los dispositivos electrénicos del Capitulo 1. Ahora veremos como codificar dicho ejemplo en C++. En principio, nuestro interés era incorporar al sistema la entidad Televisor y la entidad Radio, debido a que son dispositivos electronicos que poseen caracteristicas en comun, y, gracias ala programacion orientada a objetos, podremos realizar el modelo de un modo muy natural Crearemos una clase Hamada DispElectronico, que representara un dispositivo electrénico con caracteristicas comunes a estos, de modo que luego agregaremos la clase Televisor y la clase Radio, ambas subclases de DispElectronico. Veamos: class DispElectronico { 1/ Indica si el dispositivo se encuentra encendido 0 apagado boo! m_bEncendido; public: 1 Constructor DispElectronico(); 1/ Enciende el dispositivo void Encender() ( m_bEncendido = true; ) 1/ Apaga el dispositive >> www.redusers.com cH GEa5 221 void Apagar() { m_bEncendido = false; } # Indica si el aparato esta encendido bool EstaEncendido() cons € return m_bEncendido; ) Analicemos un poco la declaracién anterior, ya que estamos haciendo algo nuevo: ‘+ La clase solo posee una propiedad, que es privada y representa el estado del aparato. * Ademés, cuenta con cuatro métodos publicos: el constructor {siempre leva el mismo nombre que la clase y no posee tipo), un método para “encender" el dispositivo (cambia el valor de la propiedad m_bEncendido), otro para “apagarlo” y, finalmente, un método que retorna el valor de la propiedad (no es posible accederla de otro modo porque es privada). Meétodos inline Los métodos pueden ser definidos dentro de la misma clase. Hasta aqui siempre realizabamos la declaracion en un archivo de cabecera (terminacién .h): class X « 1) Declaracién del método void m0); Y Inego, lo definiamos en un archivo de cédigo fuente (con terminacion .cpp) void X::mL() { Hew wuwredusers.com 222 Gea 6. HERENCIA Pero veamos el siguiente caso class X { 1/ Declaracién del método void m10 ( We. Ahora hemos introducido una novedad: la declaracién y definicién conjunta dentro del cuerpo mismo de la clase. Todo esto, en el archivo de cabecera. Por otra parte, ambas son maneras correctas de definir un método, y su modo de uso es exactamente el mismo. Entonces, cual es la diferencia? {Cuando usar un modo de definicion y cuando el otro? Los métodos declarados dentro del cuerpo de la clase son del tipo inline, algo que podriamos lograr realizando una definici6n clasica y anteponiendo esta palabra al tipo: inline void { m0) W. {Qué quiere decir esto? Normalmente, cuando realizamos una llamada una funcién o método, el compilador debe introducir una serie de operaciones en cédigo ensamblador para el pasaje de parametros y para resguardar ciertos registros del CPU que seran restablecidos al retorno, Por lo tanto, si estos pasos no estuviesen y el cédigo propio de la funcién fuera coplado, en lugar de realizar dicha llamada, nos estariamos ahorrando algunas operaciones que, en clerto tipo de sistemas con funciones muy solicitadas, pueden hacer una diferencia. Las funciones 0 métados inline poseen la caracteristica de no ser funciones reales, sino que el compllador se toma el trabajo de >> www.redusers.com Polimorfismo En este capitulo estudiaremos el polimorfismo, tercer gran pilar de la programacién orientada a objetos. También estudiaremos qué mecanismos implementa el lenguaje para dar soporte a esta caracteristica: entre ellos, la sobrecarga de funciones y operadores, los métodos virtuales y las clases abstractas. Sobrecarga de operadores oS binarios. + {Qué es el polimorfismo? + Sobrecarga de funciones... Parémetros opcionales + Métodos virtuales. + Destructores virtuales ... + Sobrecarga de operadores. E| modificador friend. Sobrecarga de operadores unati Operadores que no modifican cel estado del objeto.. Operadores que madifican cl estado del objeto..een nn 283 Resumen. + Actividades. AAA 266 7. POLIMORFISMO a éQué es el polimorfismo? En pocas palabras, el polimorfismo es la habilidad que poseen los objetos para reaccionar de modo diferente ante los mismos mensajes. Un objeto del tipo Puetta, al igual que un objeto de tipo Ventana, podra recibir el mensaje Abrir; sin embargo, cada uno de ellos reaccionaré de modo diferente. En C++ el polimorfismo se encuentra intimamente relacionado con el mecanismo de sobrecarga y los métodos virtuales. Veamos de qué se trata esto. A | Sobrecarga de funciones En lenguajes como el C, es comin encontrar librerias que poseen grupos de funciones que realizan la misma tarea pero con distintos tipos de datos en los parametros. De este modo, si la tarea consiste en mostrar en pantalla el dato pasado como parmetro, podremos encontramos con casos como el siguiente: void ImprimirInt(int iNum); void ImprimirChar(char Car); void ImprimirFloat(fioat fNum); E] lenguaje C++ provee un mecanismo mucho mas conveniente para realizar la misma tarea. Es posible crear funciones que tengan el mismo nombre y difieran en la cantidad y/o tipo de parametros. Teniendo esto en cuenta, el ejemplo anterior podria ser reescrito como: void Imprimir(int iNum); void Imprimir(char cCar); void Imprimir(float fNum); >> www.redusers.com CH 267 Queda claro que este procedimiento es mucho mas sensato. De este modo, el programador no debera recordar el postfijo que conforma el identificador de la funcion apropiada, ya que todas las funciones se llaman del mismo modo. A esta caracteristica del lenguaje se la denomina “sobrecarga de funciones". El compilador elige qué version es la correcta en el momento de realizar la llamada, dependiendo de la cantidad y/o el tipo de parametros pasados. Todo lo dicho se puede aplicar también a los métodos de una clase, que son, en definitiva, funciones miembros. Como el constructor es, ademas, un método, haciendo uso de la sobrecarga podriamos crear distintos tipos de constructores y dejar que el compilador seleccione cual de ellos ejecutar en funcién del modo en que se crea el objeto. Veamos un ejemplo. Supongamos que deseamos construir una clase que represente un tipo de dato “fecha’ (no existente como tipo de dato fundamental en C++): class Fecha ( float m_fFecha; public: Wie La clase almacenaré internamente la fecha como cantidad de dias desde el 30 de diciembre del aiio 1899 a la medianoche. Sin embargo, permitira construir un objeto aceptando otros formatos mas amigables para el programador. Veamos: E] primer constructor podria no recibir parametros y fijar la fecha en una arbitraria (por ejemplo, la actual): Fecha(); El segundo podria recibir la fecha en tres parametros que indiquen dia, mes y aio respectivamente wwwredusers.com — <« 268 CESS 7. POLIMORFISMO Fecha (int iDia, int iMes, iAnio); Un tercer constructor aceptaria la fecha en dia, mes, afio, hora, minuto y segundo. Fecha (int iDia, int iMes, iAnio, int iHora, int (Min, int iSeg); Por tiltimo, el constructor de copia, que recibiré una referencia constante a un objeto del mismo tipo: Fecha (const Fecha & rFec); Por lo tanto, la declaracion de la clase quedara del siguiente modo: class Fecha ‘ float m_fFecha; public: Constructor estandar Fecha(); Constructor dia/mes/ano Fecha (int iDia, int iMes, iAnio); M Constructor dia/mesfafio hh:mm:ss Fecha (int iDia, int iMes, iAnio, int iHora, int iMin, int iSeq); 1 Constructor de copia a4 6) TIPO-DE-DATO: RETORNADO POR FUNCION No es posible crear dos funciones con el mismo identifcador que solo diferan en el tipo de dato retornado, debido a que el compilador no podra distinguir cuando se desea lamar a una o a ota: boo! Footint Num}; ‘char Foo(int Num); >> www.redusers.com BE el a} Objetos persistentes WN En este capitulo estudiaremos cémo almacenar y recuperar el estado de un objeto, utilizando los recursos que el lenguaje C++ nos ofrece para la manipulacién de archivos. y {Qué es un objeto persistente?, y Manejo de archivos en C++.....302 » Escritura de un archivo Lectura de un archi Lectura y eseritura de datos binarios. Almacenar el estado de un objeto...... Objetos con punteros. Resume + Actividades AAA 302 8. OBJETOS PERSISTENTES a éQué es un objeto persistente? Sabemos que el estado de un objeto esta compuesto por el valor de todas sus propiedades. Es probable que, en algunos casos, deseemos conservar dicho estado una vez finalizada la ejecucién del programa, para poder recuperarlo luego. Entonces, el objeto deberia tener la habilidad de escribir y leer el valor de sus propiedades en un medio de almacenamiento no volatil (como por ejemplo, un archivo). Pero para poder entender mejor esto, es necesario que veamos primero cémo manipular archivos con CH. a Manejo de archivos en C++ Al igual que el lenguaje de programacién C, C++ no cuenta con primitivas de entrada y salida. Sin embargo, dispone de un conjunto de clases creadas para este fin, conocidas como las clases iostream. Stream se puede traducir como “flujo”, y es en este concepto que se basa el paquete de clases iostream para trabajar con dispositivos de entrada/salida. Utilizando flujos es que el lenguaje logra independizarse en gran medida de dispositivos fisicos a los cuales finalmente accede; entonces, enviar datos a un archivo, impresora © pantalla se suscita de forma muy similar. Podriamos pensar el flujo como una construccién programatica ala que es posible insertarle y extraerle bytes de modo secuencial y aleatorio. Especificamente hablando de archivos, a medida que invocamos métodos de lectura/escritura, existe un cursor que avanza sobre el archivo de modo que, si en la primera operaci6n de lectura hemos leido, por ejemplo, la primera mitad del archivo, en la segunda operacién leeremos la otra mitad. Por otro lado, existen flags (banderas) que mantienen estos objetos e indican el estado en el cual se encuentra el archivo. Cuando lleguemos al final de este, se activard un flag denominado eof (por End Of File; fin de archivo), y asi sabremos que no quedan mas datos en el recurso. Analicemos su estructura simplificada en la Figura 1. Luego veremos cémo se efectia la escritura y lectura en un archivo desde C+. >> www.redusers.com CH 303 [es f ream itsirea ‘ostream instream [tetreem Figura 1. Diagrama de clases ios simplificado. * La clase ios es Ja clase base de esta estructura; si bien no es una clase abstracta, usualmente no se crean instancias de esta. Simplemente contiene propiedades comunes a flujos de entrada y salida. * La clase istream deriva de ios y representa un flujo de entrada. La clase ostram deriva de ios y representa un flujo de salida. La clase ifstream deriva de istream y se especializa en la lectura de archivos. * La clase oftream deriva de ostream y se especializa en la escritura de archivos. * La clase iostream deriva de istream y ostream, por lo tanto, posee ambas interfaces y nos permite manipular un mismo flujo de entrada y de salida. © La clase fstream deriva de iostream y se encuentra especializada en la manipulacion de archivos en modo lectura y escritura. Escritura de un archivo Para escribir en un archivo, haremos uso de la clase oftream o la clase fstream. De la interfaz de ifstream utilizaremos los siguientes métodos: wwwredusers.com — <« 304 CESS OBJETOS PERSISTENTES © Abrir: cl método open de la clase oftream abre un archivo en modo escritura. void open(const char* szName, int nMode = ios::out, int nProt = filebuf::openprot); Parametros: © szName: nombre del archivo. nMode: modo en que deseamos abrir el archivo. Por defecto, pose un valor asignado, que es ios:zout, pero se pueden especificar otros, como ios:tbinary (si deseamos abrir un archivo en modo binario) iosssnocreate (si no deseamos que el archivo se cree, en caso de no existir), ios::app (si deseamos agregar datos al archivo existente, ya que, de otro modo, eliminaré todo su contenido), etcétera. nProt: modo de proteccién del archivo (si se desea abrir el archivo en modo compartido, exclusivo, etcétera). © Cerrar un archivo: el método close cierra el archivo. void close(); Verificar si un archivo se encuentra abierto: el método is_open indica si el archivo relacionado con el objeto se encuentra abierto, es decir, si ya se ha invocado el método open de manera satisfactoria. int is_open() const; Mediante este cddigo, el método retorna un valor distinto de cero si el archivo se encuentra abierto, y, de no ser asi, retorna cero. © Escribir en un archivo: para escribir en un archivo, debemos utilizar métodos de clase ostream, es decir, de la clase padre a ofstream, aunque ciertamente esto es indistinto al programador, ya que un objeto del tipo oftream poseera la interfaz de dicha clase mas las interfaces que se hereden de las clases superiores >> www.redusers.com BE el a Le Patrones de diseno WN Los patrones de disefio son soluciones documentadas a problemas clasicos surgidos en la construcci6n de sistemas orientados a objetos. En este capitulo, veremos algunos de los patrones mas populares que podremos aplicar en nuestros programas. + {Qué es un patron + El patrén Estrategi de disefio? + El patron Observador. El patrén Singleton. y Resume y El patrén Método Plant y El patrén Fabrica. AAA 328 CESS PATRONES DE DISENO a éQué es un patron de disejfio? Es comiin que se presenten problemas similares en diversos contextos en la construccién de sistemas informaticos, para los cuales se han propuesto soluciones que finalmente han sido aceptadas por su eficiencia, robustez y elegancia. Un patrén es exactamente eso: una buena solucién documentada a un problema comin. Un patrén de diseno posee un nombre, describe un problema para el cual el patrén es aplicable, describe una solucién independiente del lenguaje con diagramas (UML) y pseudocédigo (también suele ejemplificar en lenguajes populares como C++, Java y Smalltalk) y, finalmente, informa de consecuencias en la aplicacién del patron (costos y beneficios, ya que, en algunos casos, ciertos patrones son mutuamente excluyentes, y la aplicacién de uno u otro varia en funcién del contexto y el criterio del diseniador). ») El patron Singleton La intencién de este patron es asegurarse de que exista solo una instancia de clase y proveer un modo global de acceder a ella. Tradicionalmente, esto ha sido resuelto de dos maneras: la primera consiste en pasar una referencia 0 un puntero del objeto en cuestion a cada uno que requiera acceder a sus métodos y propiedades. Esto es muy ineficiente ya que estaremos agregando un nuevo parametro en la llamada a, probablemente, muchos métodos. La segunda se trata de crear una variable global que pueda ser vista desde todo el programa. Esto es poco elegante y hasta perjudicial en muchos casos, ya que, wee ew Meee eat] En nuestra implementacion, no existe manera de hacerlo; serd eliminado por el sistema cuando cl programa finalice. Es posible crear un rétodo lamado Liberarinstancia y un contador —también estatico-, de modo que se incremente en cada Tomarlnstanciay se decremente en cada LiberarInstancia (en este titimo método, cuando el contador es cero, el objeto es destruido). >> www.redusers.com CH 329 por ejemplo, nadie evita que se cree otra instancia del objeto en cuestién y, asi, existe la posibilidad de ocasionar un error en la ejecucién del programa o de que este no se comporte del modo esperado. -m_plnstanc Figura 1. Diagrama de clases siomarinstacon() ‘ ¥ ‘#Singleton() del patron Singleton. El patrén Singleton se basa en una clase que posee, basicamente, un método estatico y una propiedad estatica WH brchivo fh -— - class Singleton ‘ public: static Singleton * Tomarlnstancia(); protected: 1 Constructor Singleton() 0 private: static Singleton * m_pInstancia; i I Archivo .cpp =---- - I nicializo el valor de 1a propiedad estatica Singleton * Singleton::m_plnstancia = 0; a La clase cuenta con un método estatico que, como tal, puede ser invocado sin la necesidad de crear ningun objeto. Este método, llamado TomarInstancia, cebe ser invocado para obtener un puntero al objeto tinico. Veamos de qué forma implementarlo: Singleton * ‘ ngleton::TomarInstancia() wwwredusers.com — <« 330 9, PATRONES DE DISENO if ('Singleton::m_plnstancia) Singleton::m_plnstancia = new Singleton(): return Singleton::m_plnstancia; Como se puede apreciar, existe una sentencia condicional if que verifica el valor de la propiedad estatica m_plnstancia. Si su valor es NULL (0), entonces se crea un nuevo objeto y se retorna el valor del punteo a este. Notemos que esta condicién solo sera cierta en la primera llamada al método, y luego, en toda ocasion, se retornaré el mismo puntero. El haber colocado el constructor de la clase como protegido evita que el objeto sea instanciado del modo tradicional; en pocas palabras, el siguiente cédigo causaré un error de compilacién Singleton obj; Para poder acceder a los métodos del Singleton, deberemos codificar: Singleton * pObj = Singleton::TomarInstancia(); ) El patron Método Plantilla La tarea de este patrén consiste en definir el esqueleto de un algoritmo: en una operaci6n retardando partes de su implementaci6n a subclases. Método Plantilla permite que las subclases redefinan ciertos métodos sin cambiar la estructura del algoritmo. Este patron puede ser utilizado cuando: © Ciertos pasos de un algoritmo deben implementarse en subclases. © Cierto cédigo comin debe ser colocado en superclases para evitar la duplicacién. El cédigo sube a una superclase, y se sobrescriben los métodos que correspondan. >> www.redusers.com Puedes comprar este impreso o en formato eBook u optar por algunos de los titulos que conforman la biblioteca USERS. En encontraras las Ultimas novedades y material informativo de cada titulo, que te ayudara a decidir la compra. jRecibe promociones semanales exclusivas en tu @ usershop.redusers.com Metal ATODO EL MUNDO ViA 20ca Y Bxzzzam ** ive TUR ORD Tah U) x) et Came C++ PROGRAMACION ORIENTADA A OBJETOS Mi El presente libro tiene el doble objetivo de introducirnos y profundizar tanto en lo que se refiere a la programacién orien- tada a objetos, como al lenguaje C++, que serd nuestra principal herramienta a la hora de implementar los conceptos tedricos que vayamos estudiando. A lo largo de los distintos capitulos, conoceremos los fundamentos del lenguaje, su sintaxis bésica y la manera de escribir el primer programa en él. Ademés, veremos aspectos avanzados, como el prepro- cesador, el uso de arrays, funciones, estructuras, espacios de nombre, clases, objetos y gestin de memoria, entre otros. Analizaremos también herencia, polimorfismo, estructuras de datos dinémicas y plantillas. é C++ es un lenguaje orientado a objetos popular, moderno y en constante evolucion. A la hora de desarrollar, es la Go opcidn mas poderosa y robusta que jamas se haya creado. EN ESTE LIBRO APRENDERA: > Introduccién: programacion no estructurada, procedural, modular y orientada a objets. Analisis y seo. > Fundamentos de C++: diferencias con C, variables, palabras reservadas, constantes,booleanos, operadores, sentencas condicinals ybuces. D> Aspectos avanzads del lenguaje: entrada y salida,objelos cout y cin, preprocesador, ary, funciones, strings y numeradores D> clases yobjetos: diagramas, constructor y destructor, madificadore de acceso, propiedades y métodos estticos. D> estion de memoria: punteros, operadores new y delete, variables estaticas. > Herencia: métodos inline yconstantes, subclases, composicsn vs. herencia > Polimorfismo: sobrecarga de funciones y de operadores, madificador friend imétodos y destructores vituales. REDUSERS.com PROFESOR EN LINEA Enmuest ss poi encrtar nts acai conua nica aon lela ytambn prepa de acomunitd con, pu centers can nuetos Ceteerangamasimprans de Arica Latina. expels profesor @redusers com D> Eszobraes una vesiénwsnda Whe C++, pubes en 2008 reste misma ei >> NIVEL DE USUARIO Bisico/ interme. >> CATEGORIA ISBN 978-987-1949-64.9 o!7898 7'1'949649! >

También podría gustarte