Sie sind auf Seite 1von 73

Universidad Austral de Chile Facultad de Cs.

de la Ingeniera Instituto de Informatica

Apuntes de Clases INFO 161 : Lenguajes de Programacin Programacin Orientada a Objetos

Prof. Luis Alberto Alvarez Gonzlez

Valdivia, Agosto de 1998.-

Tabla de Contenidos
1 INTRODUCCIN. 1.1 DISEO DIRIGIDO POR RESPONSABILIDADES 1 9 14 17 19 21 24 27 30 31 31 31 33 34 35 35 38 41 43 46 47 48 49 50 50 53 55

2 CLASES. 2.1 2.2 2.3 2.4 2.5 2.6 CREACIN DE OBJETOS DE UNA CLASE. FUNCIONES EN LNEA CONSTRUCTORES DESTRUCTORES. FUNCIONES AMIGAS EJERCICIOS.

3 MS CONCEPTOS SOBRE ORIENTACIN A OBJETOS 3.1 RELACIONES. 3.1.1 RELACIN UN - TIPO - DE (A - KIND - OF RELATIONSHIP) 3.1.2 RELACIN ES UN(A) ( IS - A RELATIONSHIP) 3.1.3 RELACIN PARTE - DE 3.1.4 RELACIN TIENE - UN 3.2 HERENCIA 3.3 HERENCIA MLTIPLE 3.3.1 CLASES ABSTRACTAS 3.3.2 EJERCICIOS 4 HERENCIA EN C++ 4.1 4.2 4.3 4.4 4.5 4.6 TIPOS DE HERENCIA. CONSTRUCCIN DESTRUCCIN HERENCIA MLTIPLE. POLIMORFISMO CLASES ABSTRACTAS

5 SOBRECARGA DE OPERADORES

6 TIPOS GENRICOS

60

7 TIPOS GENRICOS (TMPLATE EN C++)

63

ii

LENGUAJES DE PROGRAMACIN

1 Introduccin. Envo de Flores Si mando flores a una dama tengo las siguientes alternativas. Alternativas 1. Lo hago directamente envindole un mensaje a Margarita la florista. 2. Usando otro objeto intermedio, por ejemplo Gertrudis, la secretaria. El objeto Margarita y el objeto Gertrudis tienen mtodos que entienden el mensaje. El objeto Margarita tiene mtodos que permiten realizar la accin. Si le pido a mi jefe Lalo que mande flores, probablemente no lo har porque no tiene el mtodo.

Orientacin a Objetos

Pgina 1

LENGUAJES DE PROGRAMACIN

En POO, la accin se inicia mediante la transmisin de un mensaje (paso de mensajes) a un agente (objeto) responsable de la accin. El mensaje tiene codificada la peticin y se acompaa de informacin adicional. Si el objeto receptor acepta el mensaje, significa que tiene los mtodos para llevarla a cabo. El objeto receptor realiza la accin.

Si hubiese ido donde la florista Rosa el resultado habra sido el mismo, porque Margarita y Rosa pertenecen a la misma clase. Esta clase la podemos llamar Florista.

Todos los objetos de una misma clase tienen los mismos mtodos.

Orientacin a Objetos

Pgina 2

LENGUAJES DE PROGRAMACIN

Probablemente Margarita pedir dinero y entregar una boleta, porque ese mtodo los usan todos los comerciantes, o sea la clase florista pertenece a una clase mayor llamada comerciante y el objeto Margarita, conoce los mtodos de la clase florista y todos los mtodos de la clase comerciante Dicho de otra forma la clase florista hereda mtodos de una clase jerrquicamente superior. Otros comerciantes son los panaderos, fotocopiadores, etc. Los comerciantes son humanos, como otro tipo de profesiones. Los Humanos son mamferos, Los mamferos son animales, Los animales son objetos materiales

Orientacin a Objetos

Pgina 3

LENGUAJES DE PROGRAMACIN

Objeto Material

Animal

Planta

Mamfero

Flor

Perro

Humano

Ornitorrinco

Comerciante

Artista

Ingeniero

Florista

Fococopiador

Pluto

Margarita

Rosa Pedro Pablo Ana

Orni

Clavel

Herencia. Las clases se pueden organizar en forma jerrquica por herencia. Una subclase heredar los mtodos de una superclase. Una superclase abstracta se usa solo para crear subclases no posee objetos.

Orientacin a Objetos

Pgina 4

LENGUAJES DE PROGRAMACIN

Un problema, los mamferos dan a luz cras vivas. La ornitorrinco Orni es mamfero y pone huevos. As que necesitamos mtodo que codifiquen excepciones para anular mtodos de las superclases.

Enlaces de Mtodos. Un mtodo se busca en la clase del objeto, si no se encuentra se busca en la superclase y as sucesivamente hasta que se encuentra. Una vez que se encuentra se ejecuta o de lo contrario emite un mensaje de error. Volviendo al ejemplo. El hecho que yo no conozca con exactitud los mtodos que usar Margarita, se conoce como ocultamiento de la informacin.

Orientacin a Objetos

Pgina 5

LENGUAJES DE PROGRAMACIN

Resolver un problema complejo usando tcnicas tradicionales, puede volverse muy engorroso, puesto que obliga a conocer variables, registros o parmetros que se usan anteriormente y de igual forma con el cdigo que viene. Para resolver ese problema, se usan:

Procedimientos, Procedimientos y funciones permiten ocultar mtodos, permite reutilizacin. Sin embargo la informacin la pueden ocultar slo parcialmente. Por ejemplo, un procedimiento para manejar una pila. Interfaz visible . rutinas, iniciar, sacar, meter y tope. Se pude usar arreglo, punteros, listas enlazadas etc. Los datos de la pila no pueden ser locales, deben ser compartidos, entonces deben ser globales. Supongamos un arreglo de nombre pila_de_datos. Problemas. Todos los programadores deben saber este nombre para no crear otro igual.

Orientacin a Objetos

Pgina 6

LENGUAJES DE PROGRAMACIN

Los nombres iniciar, sacar, meter y tope son ahora reservados.

Mdulos. La programacin modular resuelve los problemas anteriores permitiendo dividir los mdulos en dos partes, una parte privada y otra pblica. La parte privada es slo accesible por las rutinas al interior del mdulo. Problemas. Que pasa si otros usuarios desean mantener ms de una pila. La programacin modular no permite hacer la instanciacin de otros ejemplares.

Tipo de Datos Abstracto. Tipo definido por el programador. Conjunto de valores (podra ser infinito) y nmero de operaciones primitivas. Los usuarios pueden crear variables para el tipo definido. Ejemplo, definir una pila como TDA y las operaciones iniciar, sacar, meter y tope, como las nicas operaciones vlidas para pila.
Orientacin a Objetos Pgina 7

LENGUAJES DE PROGRAMACIN

Los mdulos se usan como implantacin de TDA. El TDA es un concepto. Para construir un TDA se debe ser capaz de: 1. Exportar una definicin de tipo 2. Proporcionar un conjunto de operaciones. 3. Proteger los datos asociados, de tal manera que slo se puedan usar con las operaciones establecidas. 4. Crear mltiples ejemplares del tipo. Los mdulos estn dirigidos hacia los puntos 2 y 3. Los objetos son tipos abstractos de datos.

Programacin Orientada a Objetos (POO). La POO agrega ideas nuevas al concepto de TDA. Ellas son paso de mensajes. Cambio de enfoque entre hacerlo uno mismo invocando el mtodo apropiado o que el objeto lo haga por uno. Sobrecarga de nombres Reutilizacin de software.
Mecanismos de herencia y polimorfismo (mtodos que

pueden ser aplicados a diferentes objetos)

Orientacin a Objetos

Pgina 8

LENGUAJES DE PROGRAMACIN

1.1 Diseo Dirigido por Responsabilidades Que es POO ? Respuesta tpica : clases, herencia, etc., sintaxis del lenguaje. Importante, delegacin de responsabilidades. Esta tcnica se llama diseo dirigido por responsabilidades. Una tcnica til es el uso de tarjetas CRC (Clases, Responsabilidad, Colaboradores), como se muestra en la figura
Nombre de la Clase Responsabilidades Colaboradores

Algunas reglas Usar nombre pronunciables. Usar el subrayado _ (underline) para separar palabras dentro de un nombre o usar la primera letra mayscula. Ejemplo Ordenador_de_lista u OrdenadorDeLista Usar adecuadamente las abreviaturas, por ejemplo ordlist no es un buen ejemplo, sin embargo IDuser
Orientacin a Objetos Pgina 9

LENGUAJES DE PROGRAMACIN

podra ser una abreviatura al nmero de identificacin de usuario. No usar dgitos que confundan al lector por ejemplo 0 y O, 1 y l, 2 y Z, 5 y S, etc. Usar claramente variables boolianas, por ejemplo Impresora_Lista es mejor que Estado_Impresora. Un ejemplo es el de cajeros automticos

Lector_de_Tarjetas
Muestre mensaje de bienvenida, espera tarjeta Pida al Verificador_de_NIP que compruebe validez Llame al Selector_de_Actvidad Devuelve tarjeta a usuario

Colaboradores
Verificador_de_NIP Selector_de_Actvidad

Verificador_de_NIP
Recibe nmero NIP del Manejador_de_cuenta. Devuelve falso si no hay cuenta Presenta ventana de solicitud de NIP Recibe el NIP del usuario Compara NIP, devuelve resultado

Colaboradores
Manejador_de_cuenta

Orientacin a Objetos

Pgina 10

LENGUAJES DE PROGRAMACIN

Manejador_de_cuenta
Verifica valides de cuenta; devuelve NIP Verifica informacin retiro/depsito

Colaboradores

Selector_de_actividad
Muestra men de actividades Espera seleccin del usuario Llamar al manejador de la transaccin adecuada

Colaboradores
Manejador_de_depsito Manejador_de_retiros

Manejador_de_Retiros
Pregunta al usuario la cantidad a retirar Verifique la cantidad con Manejador_de_Cuenta

Colaboradores
Manejador_de_cuenta Distribuidor_de_efectivo

Diga al Distribuidor_de_efectivo que descargue efectivo

Caja_electrnica
Dar efectivo Dar sobre de depsitos con indicacin de hora Recuperar sobre del depsito.

Colaboradores
Manejador_de_retiros Manejador_de_depsitos

Orientacin a Objetos

Pgina 11

LENGUAJES DE PROGRAMACIN

Ejemplos.Organizacin de escuela. profesores, alumnos, director, inspector, auxiliar, jardinero. Industria. Gerente, asesores, secretaria, Ingenieros, tcnicos, trabajadores,

Orientacin a Objetos

Pgina 12

LENGUAJES DE PROGRAMACIN

Orientacin a Objetos

Pgina 13

LENGUAJES DE PROGRAMACIN

2 Clases. Un objeto es una instancia de una clase. Un objeto tiene un estado y uno o varios mtodos. La estado es privado y puede ser accesado solo su propios mtodos.

Objeto
estado

mtodos

Una clase, es a la cual pertenecen los objetos. Por lo tanto.

Una clase tiene una parte pblica y una parte privada. La parte privada tiene que ver con el estado del objeto. La parte pblica es la interfaz al objeto.

Orientacin a Objetos

Pgina 14

LENGUAJES DE PROGRAMACIN

Ejemplo class Point { private : int xVal, yVal; public: void SetPt(int,int); void OffsetPt(int,int); }; Se declara una clase llamada Point. Tiene cuatro componente. xVal, yVal, SetPt y OffsetPt. Tiene dos datos miembros y dos funciones miembros. La parte privada est compuesta por los datos miembros. La parte pblica esta compuesta por las funciones miembros y la forma en como podr accesarse los objetos. No importa el orden de la parte pblica y privada. Si la primera parte es la privada, se puede omitir private. Es decir quedara.
class Point { int xVal, yVal; public: void SetPt(int,int); void OffsetPt(int,int); void PrintPt() ; };
Orientacin a Objetos Pgina 15

LENGUAJES DE PROGRAMACIN

El encabezado de las declaraciones de las funciones miembros deben ser de la siguiente forma : tipo clase :: funcin (parmetros) por ejemplo void Point::SetPt(int x, int y) xVal=x; yVal=y; } {

void Point::OffsetPt(int x, int y) { xVal+=x; yVal+=y; } Esto se lee : De la clase Point se declara setPt como ... La funcin setPt asigna los valores x e y a los valores privados xVal, yVal. La funcin OffsetPt le agrega a xVal e yVal, los valores de x e y. O sea xVal+=x; equivale a xVal=xVal+x;

Orientacin a Objetos

Pgina 16

LENGUAJES DE PROGRAMACIN

2.1 Creacin de Objetos de una clase. Se hace de la misma que la declaracin de los tipos concretos, por ejemplo, Point punto_1, punto_2, xy, pt; aqu, punto_1, punto_2, xy y pt, son objetos de la clase Point . Point . punto_1 punto_2 xy pt

Se pueden crear infinitos objetos de una clase. Se puede accesar un mtodo pblico de un objeto, de la siguiente manera. objeto.mtodo(parmetros); Por ejemplo a un objeto lo podemos fijar en un punto pt.SetPt(10,10); y posteriormente lo podemos incrementar en 2 unidades en x e y, o sea pt.OffsetPt(2,2);

Orientacin a Objetos

Pgina 17

LENGUAJES DE PROGRAMACIN

Aqu estamos trabajando con el objeto pt. Intentar accesar un dato privado es ilegal, por ejemplo pt.xVal=10; // ilegal

Otro ejemplo, Supongamos la clase fecha class fecha { int mes,dia,agno; public: void fijar(int,int,int); void siguiente(); void imprimir(); }; con las siguientes definiciones, void fecha::fijar(int d,int m, int a) { dia=d; mes=m; agno=a; } void fecha::siguiente() { dia++; if(dia>28).... } void fecha::imprimir() { cout<<dia<<"/"<<mes<<"/"<<agno<<'\n';
Orientacin a Objetos Pgina 18

LENGUAJES DE PROGRAMACIN

} Si definimos un objeto hoy, por ejemplo, fecha hoy; Como poder obtener el dia, mes y agno del objeto hoy ? Respuesta. El dia, mes y agno de hoy son privados. Por lo tanto la nica forma es a travs de una funcin miembro. Tendremos entonces que agregar una funcin miembro a la clase. Llamemos a esta funcin obtener En la clase deber definirse de la siguiente forma : void obtener(int*,int*,int*); Cual deber ser su declaracin.? Tarea: Hacer un programa que cree el objeto hoy de la clase fecha. Fije el objeto hoy en 25 de abril de 1996, a continuacin incremente hoy al da siguiente y muestre el contenido sin usar el mtodo imprimir y usndolo.

2.2 Funciones en lnea Cuando un mtodo se declara en la misma definicin de la clases se dice que esta en lnea, del ejemplo

Orientacin a Objetos

Pgina 19

LENGUAJES DE PROGRAMACIN

class fecha { int mes,dia,agno; public: void fijar(int d,int m, int a) {dia=d; mes=m; agno=a;} void siguiente(); void imprimir() {cout<<dia<<"/" <<mes<<"/" <<agno<<'\n';}
};

De esta forma se aumenta la eficiencia de los objetos de la clase. Otra forma de declarar las funciones en lnea es usando la sentencia inline, de esta forma quedara inline void fecha::fijar(int d,int m, int a) { dia=d; mes=m; agno=a; } La declaracin de un mtodo dentro de la definicin ayuda a la eficiencia, pero atenta contra la claridad del programa. Conclusin. Usar funciones en lnea slo cuando la sea muy importante la eficiencia o cuando la definicin sea realmente corta.

Orientacin a Objetos

Pgina 20

LENGUAJES DE PROGRAMACIN

2.3 Constructores Supongamos que declaramos un objeto pt de la clase Point y posteriormente, invocamos el mtodos OffsetPt e imprimimos el resultado. Que ocurre ? Point pt; pt.OffsetPt(2,2); pt.PrintPt();

O creamos el objeto hoy de la clase fecha y a continuacin invocamos el mtodo siguiente() e imprimimos la nueva fecha. fecha hoy; hoy.siguiente(); hoy.imprimir(); Se debe entonces, declarar el objeto e inmediatamente despues inicializarlo, O sea, Point pt; pt.set(10,10); y fecha hoy; hoy fijar(26,4,96)

Orientacin a Objetos

Pgina 21

LENGUAJES DE PROGRAMACIN

Para que evitar cualquier olvido, el objeto debera poder inicializarse al momento de su declaracin. Por ejemplo Point pt(10,10); y fecha hoy(26,4,96); Como debera definirse la clase para que esto ocurra ? Si se declara un mtodo pblico con el mismo nombre de la clase, entonces se puede realizar. El mtodo con el mismo nombre de la clase y que tiene como objetivo inicializar los objetos que se declaren de la clase se llaman constructores. As la clase quedara class Point { int xVal, yVal; public: Point(int x, int y) {xVal=x; yVal=y;} void OffsetPt(int,int); void PrintPt() ; }; Notas : El constructor esta declarado en lnea, pero no es necesario. El constructor no debe estar precedido por algn tipo o void.

Orientacin a Objetos

Pgina 22

LENGUAJES DE PROGRAMACIN

De esta forma ahora podemos declarar, Point pt(10,10), pt1(0,0), pt2(1,3); y fecha hoy(26,4,96), eclipse(5,5,96);

Sera interesante poder usar la misma clase para crear objetos que permitan manejar puntos en coordenada polares u otras. De igual forma poder escribir las fechas de distinta manera. Para resolverlos se puede hacer uso de la sobrecarga y escribir varios constructores uno para cada caso. Por ejemplo class Point { int xVal, yVal; public: Point(int x, int y) {xVal=x; yVal=y;} Point() {xVal=yVal=0;} void OffsetPt(int,int); void PrintPt() ; }; Point::Point(float radio,float angulo) { xVal=(int) (radio*cos(angulo)); yVal=(int) (radio*sin(angulo)); };

Orientacin a Objetos

Pgina 23

LENGUAJES DE PROGRAMACIN

Note que como xVal e yVal son declarados enteros, es necesario que la operacin sea convertida finalmente a enteros. Podemos crear los siguientes objetos

Point pt(10,10), pt1(0.0,0.0), pt2; As pt trabaja en coordenadas cartesianas, pt1 en coordenadas polares y pt2 en coordenadas cartesianas pero se inicializa con 0.

De igual manera con los objetos de la clase fecha. Se podra ingresar fecha de distintas maneras, por ejemplo en forma int dia,char* mes, int* agno.

2.4 Destructores. En algunos casos los objetos creados, necesitan espacio en memoria adicional, el cual debe ser creado en la funcin constructor, por ejemplo crear un arreglo,

Orientacin a Objetos

Pgina 24

LENGUAJES DE PROGRAMACIN

class vector { int tamagno; int* v; . public: vector(int); // constructor . . } donde vector::vector(int t) { tamagno=t; v=new int[t]; // asigna espacio a // un arreglo de t // enteros } Sin embargo, una vez que se deja de usar un objeto, se puede liberar la memoria que usar, para ello se usa un destructor. Los destructores tiene el mismo nombre de la clase pero estn precedidos por un tilde (~)

Orientacin a Objetos

Pgina 25

LENGUAJES DE PROGRAMACIN

ejemplo class vector { int tamagno; int* v; . public: vector(int); // constructor ~vector(); // destructor . } donde vector::~vector() { delete [] v; // // // // } libera el espacio que ocupaba el arreglo al que apunta v

Orientacin a Objetos

Pgina 26

LENGUAJES DE PROGRAMACIN

2.5 Funciones Amigas Supongamos las clases vector y matriz. El vector de 4 elementos y la matriz de 4 columnas o vectores. El acceso a cada uno de los elementos, se obtiene con la funcin elem(). Si se desea multiplicar, se puede construir una funcin que no pertenezca a ninguna de las clases y lo permita, esto sera,
vector multiplicar(const matriz& m, const vector& v) vector r; for(int i=0;i<3;i++) { r.elem(i)=0; for(int j=0;j<3;j++) r.elem(i)+=m.elem(i,j)*v.elem(j); } return r; } {

Desventajas, multiplicar() llama a elem() 4*(1+4*3). Si elem() verifica intervalo => an mas tiempo. Si multiplicar fuera funcin nica de la clase vector y la clase matriz, no habra necesidad de verificar y podra evitarse la funcin elem(). Pero, una funcin no puede ser miembro de dos clases. Recuerde, tipo clase::funcin(parmetros);
Orientacin a Objetos Pgina 27

LENGUAJES DE PROGRAMACIN

Solucin. En la definicin de clases debe existir forma de declarar una funcin que no pertenezca a la clases, pero que si tenga acceso a la parte privada de los objetos de la clase. Las funciones as declaradas, se llaman funciones amigas y se declaran de la siguiente forma class matriz; class vector { float v[4]; //.. friend vector multiplicar(const matriz&, const vector&); } class matriz { vector v[4]; //.. friend vector multiplicar(const matriz&, const vector&); } Una funcin friend puede ser puesta tanto en la parte privada como en la pblica.

Orientacin a Objetos

Pgina 28

LENGUAJES DE PROGRAMACIN

Luego la funcin friend queda como sigue, vector multiplicar(const matriz& m, const vector& v) { vector r; for(int i=0;i<3;i++) { r.v[i]=0; for(int j=0;j<3;j++) r.v[i]+=m.v[i][j]*v.v[j]; } return r; } Una funcin friend puede ser amiga de ms de dos clases. Una funcin miembro, es adems una interfaz a la clase. Una funcin miembro de una clase puede ser declarada amiga por otra, ejemplo, class x { //.. void f(); }; class y { //.. friend void x::f(); }; sto ltimo se conoce como miembros amigos.

Orientacin a Objetos

Pgina 29

LENGUAJES DE PROGRAMACIN

2.6 Ejercicios. 1. Escribir programas completos con las clases Point y Fecha, sin usar constructores y usndolos. 3. Defina una clase letra que tenga como funciones: escribir_letra imprima las letras a`,..,`z` y los dgitos 0,..,9 escribir_ascii que imprima sus valores enteros, y escribir_hexa utilizando notacin hexadecimal. 4. Cuales son nombre apropiados para clases, objetos y mtodos : Imprimir, raiz_cuadrada, complejo, ao_bisiesto, fecha, hora. 5. - Escriba definiciones para las clases: complejo, vector, matriz. 6. - Escriba las declaraciones de todas las funciones miembros de las clases anteriores. Use Constructores. 7. - Escriba pequeos programas completos, donde se creen objetos de las clases anteriores y se pueda usar cada uno de los mtodos o funciones miembros de los objetos.

Orientacin a Objetos

Pgina 30

LENGUAJES DE PROGRAMACIN

3 Ms Conceptos sobre Orientacin a Objetos 3.1 Relaciones.

3.1.1 Relacin Un - Tipo - De (A - Kind - Of Relationship) Consideremos que tenemos que escribir un programa para dibujar varios objetos tales como puntos, crculos, rectngulos, tringulos etc. Para cada objeto debemos tener una clase. Por ejemplo, si usamos un pseudo lenguaje para definir la clase punto, tenemos : class Punto { atributos: int x, y mtodos: fijarX(int nuevoX) obtenerX() fijarY(int nuevoY) obtenerY() }

Orientacin a Objetos

Pgina 31

LENGUAJES DE PROGRAMACIN

Si continuamos definiendo una clase para definir crculos tenemos, class Circulo { attributos: int x, y, radio mtodos: fijarX(int nuevoX) obtenerX() fijarY(int nuevoY) obtenerY() fijarRadio(int nuevoRadio) obtenerRadio() } Donde x e y define el centro de los objetos de circulo. Si comparamos ambas clases se observa lo siguiente: Ambas clases tienen los elementos x e y. En la clase Punto, estos describen la posicin del punto, en la clase Circulo, estos describen el centro del circulo. As x e y, tienen el mismo significado; en ambas clases describen, a travs de un punto, la posicin del objeto asociado. Ambas clases ofrecen el mismo conjunto de mtodos para fijar y obtener x e y. La clase Circulo agrega un nuevo elemento llamado radio y los mtodos de acceso correspondiente.

Orientacin a Objetos

Pgina 32

LENGUAJES DE PROGRAMACIN

Conociendo las propiedades de la clase Punto, se puede describir un crculo como un punto + un radio y los mtodos de acceso de este. De esta forma un crculo es A - Kind - Of punto. (un circulo es un tipo de punto) Sin embargo, un crculo es un poco ms especializado.
A - Kind - Of

Crculo

Un - Tipo - De

Punto

La relacin A - Kind - Of es usada a nivel de clases Para esta relacin comnmente se usa Las clases encerradas dentro de rectngulos. El nombre de la clase comienza con mayscula El sentido de la flecha indica la relacin A - Kind Of. 3.1.2 Relacin Es Un(a) ( Is - A relationship) Si creamos objetos de tales clases, su relacin ser Es Un(a) (Is - A). Ya que la clase Circulo es un tipo de Punto, un objeto de Circulo, digamos circulo es un punto. Consecuentemente, cada crculo se comporta como un punto. Por ejemplo, un punto se puede mover en la direccin

Orientacin a Objetos

Pgina 33

LENGUAJES DE PROGRAMACIN

x alterando el valor de x. De manera similar se puede mover un crculo.

Is - A

circulo

Es - Un

punto

Para representar la relacin Es - Un se usar : Los objetos se escribirn con letra minscula. Los rectngulos tendran las esquinas redondeadas.

3.1.3 Relacin Parte - De Algunas veces se necesita construir un objeto para combinarlo con otros. En la programacin procedural se puede usar estructuras o records. Supongamos que se han creado varias clases para diferentes figuras, entre ella Circulo y Triangulo. Si decidimos crear una figura especial para representar nuestro logo, que consiste de un crculo y un tringulo. As nuestro logo tendr dos partes, crculo y tringulo que son Parte - De nuestro logo, es decir:

Orientacin a Objetos

Pgina 34

LENGUAJES DE PROGRAMACIN

class Logo { atributos : Circulo circulo Triangulo triangulo mtodos: fijarLogo(Punto donde) }

Circulo

Parte - De

Logo

Parte - De

Triangulo

3.1.4 Relacin Tiene - Un Esta es la relacin inversa de la relacion Parte - De


Parte - De Parte - De

Circulo

Tiene - Un

Logo

Tiene - Un

Triangulo

3.2 Herencia Con la herencia podemos usar la relacin A - Kind - Of para clases y la relacin Is - A para objetos. Las clases que son A - Kind - Of otra clase comparte propiedades de las ltimas. Por ejemplo si se declara la clase Circulo como heredada de Punto, se tiene:

Orientacin a Objetos

Pgina 35

LENGUAJES DE PROGRAMACIN

class Circulo heredada de Punto { atributos: int radio metodos: fijarRadio(int nuevoRadio) obtenerRadio() } La clase Circulo hereda todos los atributos y mtodos de la clase Punto, por lo tanto no necesita definir los atributos y mtodos Punto. A nivel de objetos, un circulo, podra usar un punto, porque un circulo es un punto. Por ejemplo se puede definir un objeto circulo y fijar su centro se la siguiente forma : Circulo acirculo acirculo.fijarX(1) // heredada de Punto acirculo.fijarY(2) acirculo.fijarRadio(3) // agregada a Circulo La relacin Es un implica que podemos usar un circulo en cualquier parte donde exista un punto. Por ejemplo si escribimos una funcin llamada mueve, que permite mover un punto en la direccin x mueve(Punto apunto, int delta_x) { apunto.fijaX(apunto.obtenerX()+delta_x) }

Orientacin a Objetos

Pgina 36

LENGUAJES DE PROGRAMACIN

Un circulo heredado de punto puede usar un crculo como argumento, para mover el punto centro. Circulo acirculo ... move(acirculo,10) // mueve el circulo // moviendo el punto centro.

Definiciones.Herencia.- Es el mecanismo con el cual una clase A hereda las propiedades de la clase B. Se dice A es heredada de B. Los objetos de la clase A tiene acceso a los atributos y mtodos de la clase B sin necesidad de redefinirlos.

Superclase/Subclase.- Si A es heredada de B, entonces B es llamada superclase de A y A es llamada subclase de B.

Los objetos de una subclase comparten el mismo comportamiento que los objetos de la superclase. Las superclases tambin son conocidas como clases padres o clases base y las subclases como clases hijas o clases derivadas.

Orientacin a Objetos

Pgina 37

LENGUAJES DE PROGRAMACIN

Del ejemplo Punto

heredada de

Circulo

3.3 Herencia Mltiple Una clase puede ser subclase de mas de una superclase. Una subclase por lo tanto puede mesclar las propiedades heredadas de las superclases. Supongamos que existe una clase String que permite manipilacin de texto. Por ejemplo con un mtodo que permite agregar otro texto. Si en nuestro programa que dibuja objetos queremos agregar texto. Sera interesante que adems podamos podamos mover el texto en el dibujo. Para resolver el problema crearemos una clase String_Dibujable que herede las propiedades de Punto y String.
Orientacin a Objetos Pgina 38

LENGUAJES DE PROGRAMACIN

Punto

String

String_Dibujable

En el pseudo lenguaje usaremos coma (,) para separar las mltiples herencias.

class String_Dibujable heredada de Punto, String { atributos: // todos los heredados de las // superclases mtodos: // todos los heredados de las // superclases } Podemos usar objetos de String_Dibujable como si fueran objetos Punto o String. As

Orientacin a Objetos

Pgina 39

LENGUAJES DE PROGRAMACIN

String_Dibujable dstring ... move(dstring, 10) ... Esto es posible porque dstring es un punto ( donde punto es un objeto de Punto)

Por otro lado si en la clase String existe el mtodo agregar para agregar texto, o sea tambin podemos hacer, dstring.agregar(Esta caja es ...)

Definicin.Si la clase A hereda de mas de una clase, por ejemplo de B1, B2, ..., Bn, podemos hablar de mltiple herencia. Esto puede producir conflictos de nombre si al menos dos de las superclases definen propiedades con el mismo nombre.

El problema de conflicto de nombre puede ser resuelto de la siguientes dos formas :

1. El orden en el cual las superclases son provistas. 2. La subclase puede resolver el conflicto especificando la superclase.

Orientacin a Objetos

Pgina 40

LENGUAJES DE PROGRAMACIN

Otra forma es usando otra superclase para las clases que heredan.

Las mltiples herencias son un mecanismo poderoso, sin embargo puede producir conflictos de nombres.

3.3.1 Clases Abstractas Con herencia forzamos a una subclase a tener las mismas propiedades que la superclase. Consecuentemente, los objetos de una subclase tienen el mismo comportamiento que los objetos de la superclase.

Orientacin a Objetos

Pgina 41

LENGUAJES DE PROGRAMACIN

En el programa de dibujo, cada objeto deber proveer un mtodo para dibujar su rea. Sin embargo, dibujar un crculo es diferente a dibujar un rectngulo. Supongamos el mtodo print(). que fuerce a todos los objetos dibujables a tener tal mtodo. Para esto definamos la clase Objeto_Dibujable de la cual todos los objetos dibujables heredan sus propiedades :

abstracta class Objeto_Dibujable { atributos: mtodos: print() } Se introduce la palabra clave abstracta, para especificar que las heredadas deben re definir el mtodo print(). As, desde el punto de vista de una clase abstarcta las propiedades estas especificadas, pero no definidas.

Orientacin a Objetos

Pgina 42

LENGUAJES DE PROGRAMACIN

Ejemplo class Punto heredada de Objeto_Dibujable { atributos: int x,y mtodos : fijarX(int nuevoX) obtenerX() fijarY(int nuevoY) obtenerY() print() //re definida para Punto } Definicin. Una clase A es llamada abstracta si slo es usada como superclase para otras clases. La clase A slo especifica propiedades. Esta no es usada para crear objetos. Las clases derivadas deben definir las propiedades de A.

3.3.2 Ejercicios 1.- Herencia. Considere los siguientes programas de dibujo. a) Defina la clase Rectngulo por herencia de Punto. El punto debe indicar la esquina superior izquierda del rectngulo. Cuales son sus atributos. ?. Que mtodos adicionales debe agregar ?.

Orientacin a Objetos

Pgina 43

LENGUAJES DE PROGRAMACIN

b) Todos los ejemplos anteriores estan basados en dos dimensiones. Si ahora introduce objetos en tres dimensiones como esferas y cubos. Disee una clase Esfera que use la Clase Punto3D. Especifique el rol del punto en una esfera. Que relacin existe entre la clase Punto y Punto3D ? c) Que funcionalidad le da mover() a los objetos 3D ?. Puede usarse. d) Dibuje un grafo de herencia que incluya las clases Objeto_Dibujable, Punto, Crculo, Rectngulo, Punto3D y Esfera. e) Fijece en el grfo de la clase Esfera. . Puede la siguiente ser una definicin ?

Punto

Circulo

Esfera

Orientacin a Objetos

Pgina 44

LENGUAJES DE PROGRAMACIN

class Esfera heredada de Circulo { atributos: int z // agrega tercera dimensin mtodos: fijarZ(int nuevoZ) obtenerZ() } De razones para ventajas y desventajas de esta alternativa.

2.- Herencia Mltiple. Compare el grfo de la figura con el de clase. Cuales son las diferencias ?. Que conflictos de nombres ocurren ?

Orientacin a Objetos

Pgina 45

LENGUAJES DE PROGRAMACIN

4 Herencia en C++

Asumamos que tenemos la clase Punto como, class Punto { int _x, _y; public: Punto() {_x=_y=0;} Punto(const int x, const int y) {_x=x; _y=y;} ~Punto() {// nada } void fijarX(const int x){_x=x;} void fijarY(const int y){_y=y;} int obtenerX(){return _x;} int obtenerY(){return _y;} } La palabra usada anteriormente como heredada de se reemplaza por dos puntos (:). Si la clase Punto3D se hereda de la clase Punto se escribe,

Orientacin a Objetos

Pgina 46

LENGUAJES DE PROGRAMACIN

class Punto3D : public Punto { int _z; public: Punto3D(){fijarX(0);fijarY(0);_z=0} Punto3D(const int x, const int y, const int z,) { fijarX(x);fijarY(y);_z=z } ~Punto3D() {// nada } void fijarZ(const int z){_y=z;} int obtenerZ(){return _z;} } 4.1 Tipos de Herencia. En C++ existen dos tipos de herencia : Pblica Privada Si se usa herencia pblica: Todos lo que es declarado privado en la superclase, permanece privado. Todos lo que es declarado pblico en la superclase, permanece pblico. Si se usa herencia privada : Todo lo declarado en la superclase (pblico y privado), es privado en la subclase.

Orientacin a Objetos

Pgina 47

LENGUAJES DE PROGRAMACIN

4.2 Construccin Note que la inicializacin de una instancia de Punto3D se hace usando un constructor, el cual llama los mtodos pblicos de Punto para inicializar x e y. Sin embargo, podra haberse usado el constructor de Punto, es decir, class Punto3D : public Punto { int _z; public: Punto3D():Punto(){_z=0;} Punto3D(const int x, const int y, const int z,): Punto(x,y) {_z=z; } ~Punto3D() {// nada } void fijarZ(const int z){_y=z;} int obtenerZ(){return _z;} } Si se usan mas superclases, los constructores se separan por comas. Supongamos que la clase Logo esta formada slo por un objeto de la clase Circulo y otro de la clase Rectangulo, entonces, quedara

Orientacin a Objetos

Pgina 48

LENGUAJES DE PROGRAMACIN

class Logo { Circulo acirc; Rectangulo arec; ... public: Logo(Circulo c, Rectangulo r): Circulo(a),Rectangulo(r) {} .... } De acuerdo a esto la clase Punto pudo haber sido escrita class Punto { int _x, _y; public: Punto():_x(0),_y(0) {} Punto(const int x, const int y): _x(x),_y(y){} ... ... } 4.3 Destruccin Si un objeto es destruido, los destructores de las superclases tambin son invocados.

Orientacin a Objetos

Pgina 49

LENGUAJES DE PROGRAMACIN

4.4 Herencia Mltiple. Las superclases se separan por comas, ejemplo class StringDibujable: public Punto, public ObjetoDibujable { ... public: StringDibujable(...):Punto(...), ObjetoDibujable(...) { ... } }; 4.5 Polimorfismo Es posible crear mtodos virtuales de alguna clase particular, para poder mas tarde se definidos. En C++ class ObjetoDibujable { public: virtual void print(); }; Si ahora declaramos class Punto : public ObjetoDibujable { ... public: void print(){ ... // definicin } }

Orientacin a Objetos

Pgina 50

LENGUAJES DE PROGRAMACIN

De nuevo print() es un mtodo virtual, porque hereda esta propiedad de ObjetoDibujable. Si se crea una funcin cualquiera, encargada de dibujar un ObjetoDibujable cualesquiera, puede ser definida como : void desplegar(const ObjetoDibujable &obj) { // instrucciones necesarias previas obj.print(); } Cuando se usa mtodos virtuales, algunos compiladores reclaman, si el destructor de la correspondiente clase no es declarado tambin virtual. Esto es necesario cuando se usan punteros a una subclase (virtual) y se desea destruir objetos de estos ltimos. Si el destructor es virtual, se invoca al destructor del objeto actual referenciado ( y as, recursivamente a todos los destructores de las superclases). Ejemplo

Orientacin a Objetos

Pgina 51

LENGUAJES DE PROGRAMACIN

class Color { public: virtual ~Color(); }; class Rojo: public Color { public: ~Rojo(); //virtualmente heredada } class RojoFuerte: public Rojo { public: ~RojoFuerte(); }; Si se define paleta como, Color *paleta[3]; paleta[0]=new Rojo; //dinmicamente paleta[1]=new RojoFuerte; paleta[2]=new Color;

de Color

crea un nuevo Rojo

El operador new crea un nuevo objeto del tipo especificado en memoria dinmica y retorna un puntero de ste. As, new Rojo retorna un puntero a un objeto de la clase Rojo y lo asigna al primer elemento del arreglo paleta. Los elementos de paleta son punteros a Color y porque Rojo es-un Color la asignacin es vlida. El operador contrario es delete, que explcitamente destruye un objeto referenciado por un puntero, de esta forma se puede usar
Orientacin a Objetos Pgina 52

LENGUAJES DE PROGRAMACIN

delete palette[0]; // invoca al destructor ~Rojo y de ~Color() delete palette[1]; // invoca a destructor ~RojoFuerte y ~Color() delete palette[2]; // invoca al destructor ~Color() La invocacin a varios destructores es debido a que los destructores son virtuales. Si los destructores no hubiesen sido declarados como virtuales slo se habra invocado el destructor ~Color.

4.6 Clases Abstractas Las clases abstractas son definidas como clases ordinarias. Sin embargo, algunos de sus mtodos pueden ser diseados para que necesariamente deban ser definidos en las subclases. Llamaremos signature o firma al tipo que retorna, nombre y parmetros que usa, pero no a la definicin. Ejemplo, class ObjetoDibujable { public: ... virtual void print()=0;
Orientacin a Objetos Pgina 53

LENGUAJES DE PROGRAMACIN

}; Con =0 estamos obligando a el mtodo print() sea definido en la subclase. Tambin a este tipo de mtodos se les denomina mtodos puros. La clases abstractas contienen slo mtodos puros.

Orientacin a Objetos

Pgina 54

LENGUAJES DE PROGRAMACIN

5 Sobrecarga de Operadores Para tipos definidos por el usuario, es posible re-definir los operadores establecidos para los tipos concretos, es decir +, -, * , / , etc. Por ejemplo supongamos la clase Complejo de la siguiente forma class Complejo { double _real, _imag; public: Complejo(): _real(0.0), _imag(0.0) {} Complejo(const double real, const double imag) : _real(real), _imag(imag) {} Complejo suma(const Complejo op); Complejo mul(const Complejo op); ... }; Luego si se define Complejo a(1.0, 2.0), b(3.5, 1.2), c; c=a.suma(b); se asigna la suma de a y b a c. Esto es correcto, sin embargo resulta mas entendible usar el operador +.

Orientacin a Objetos

Pgina 55

LENGUAJES DE PROGRAMACIN

Afortunadamente C++ permite la sobre carga de operadores. De esta forma, usando sobrecarga de operadores se escribe : class Complejo { ....; public: ... Complejo operator+(const Complejo &op) { double real = _real+op._real, imag = _imag+op._imag; return(Complejo(real,imag)); } ... }; Ahora podemos escribir la expresin anterior como : c = a + b; esto es interpretado como, c = a.operator+(b); si queremos usar la funcin de la siguiente forma : c = operator+(a,b); se comete un error porque la sobrecarga del operador no esta definida con dos argumentos :
Orientacin a Objetos Pgina 56

LENGUAJES DE PROGRAMACIN

Por otra parte se dice que por definicin a+b es equivalente a operator+(a,b), por lo tanto se debe definir como,
Complejo operator+(Complejo a1, Complejo a2) { return complejo(a1._real + a2._real, a1._imag+a2._imag) }

sin embargo, es necesario accesar la parte real y imaginaria de un Complejo, por lo tanto una buena definicin sera, class Complejo { double _real, _imag; public: double real(return _real); double imag(return _imag); ... ... };
Complejo operator+(Complejo a1, Complejo a2) { return complejo(a1.real + a2.real, a1.imag+a2.imag) }

Las funciones amigas permiten accesar la parte privada, entonces podra resultar mejor declarar las clase y sus operadores como sigue,

Orientacin a Objetos

Pgina 57

LENGUAJES DE PROGRAMACIN

class Complejo { double _real, _imag; public: ... friend Complejo operator+(Complejo a1, Complejo a2); ... ... }; Complejo :: friend Complejo operator+(Complejo a1, Complejo a2) { return complejo(a1.real + a2.real, a1.imag+a2.imag) } ... ...

Orientacin a Objetos

Pgina 58

LENGUAJES DE PROGRAMACIN

La clase completa quedara,


class Complejo { double _real, _imag; public: Complejo(double r=0, double i=0) {_real=r; _imag=i; } void print(); friend Complejo operator+(Complejo,Complejo); friend Complejo operator*(Complejo,Complejo); friend Complejo operator/(Complejo,Complejo); }; void Complejo :: print(){ cout << _real << + <<_imag <<\n; } Complejo operator+(Complejo a1, Complejo a2) { return complejo (a1._real + a2._real, a1._imag+a2._imag) } Complejo operator*(Complejo a1, Complejo a2) { return complejo(a1._real*a2._real a1._imag*a2._imag, a1._real*a2._imag + a1._imag*a2._real) }

Tarea
Complejo operator/(Complejo a1, Complejo a2)

Orientacin a Objetos

Pgina 59

LENGUAJES DE PROGRAMACIN

6 Tipos Genricos Los Tipos de Datos Abstractos (TDA) se usan para definir tipos creados por el usuario. A partir de los cuales nacen las clases. Por ejemplo se puede pensar en una lista de manzanas, autos o cualquier lista. La definicin semntica de la lista es siempre la misma. Solo cambia el tipo de datos de acuerdo al tipo de lista. Esta informacin adicional puede ser especificada por un parmetro genrico el cual es especificado al momento de la creacin de la instancia.. De esta forma una instancia de un TDA genrico es una instancia de una variante particular de un TDA. Por ejemplo Lista<Manzanas> Lista_de_Manzanas Los parntesis en ngulos encierran el tipo de dato variante del TDA Lista. Lista_de_Manzanas tiene las mismas interfaces de cualquier lista pero funciona con instancias de tipo Manzanas.

Orientacin a Objetos

Pgina 60

LENGUAJES DE PROGRAMACIN

Cuando se define una clase, debemos especificar que estamos definiendo un tipo genrico. Sin embargo no se sabe que tipo de clase se usar. O sea, se debe definir una clase con un recipiente donde se indique el tipo de clase. La definicin de clase debe proveer un molde (template). La clase, de acuerdo a nuestra definicin esta definida para un tipo particular de objetos. Un ejemplo para la definicin para un tipo genrico ser: template class Lista T { atributos : ... //Datos necesarios mtodos : agregar (T elemento) T obtener_primero() T obtener_proximo() ... } La clase anterior es como cualquier clase. Sin embargo la clase lista es declarada como un molde para varios tipos de listas. El identificador T es el recipiente. Por ejemplo para una lista de manzanas.

Orientacin a Objetos

Pgina 61

LENGUAJES DE PROGRAMACIN

Lista <Manzanas> Lista_de_Manzanas Manzanas una_manzana, otra_manzana Manzanas.agregar(otra_manzana) Manzanas.agregar(una_manzana) La primera lnea declara Lista_de_Manzanas como una lista de Manzanas. La definicin anterior es similar a: class Lista { atributos : ... //Datos necesarios mtodos : agregar (Manzana elemento) Manzana obtener_primero() Manzana obtener_proximo() ... }
(Debe haber una definicin de manzanas)

El compilador debe poder crear diferentes listas es decir: Lista <Manzana> Lista_de_Manzanas Lista <Auto> Lista_de_Autos Podemos adicionalmente declarar mas listas de manzanas, es decir, Lista <Manzana> una_Lista Lista <Manzana> otra_Lista

Orientacin a Objetos

Pgina 62

LENGUAJES DE PROGRAMACIN

Definicin.- (Clase template o molde ) Si una clase A es parametrizada con un tipo de datos B . A es llamada una clase molde o clase template. Una vez que se crea un objeto de A, B reemplaza al tipo de datos. Esto permite la definicin de una clase basada en un molde especfico para A y el tipo de datos que se indica.

7 Tipos Genricos (Tmplate en C++) Los tipos de datos genrico en C++ se denominan clases templates y son similares a las clases normales. Ejemplo template <class T> class Lista : ... { public: ... void agregar(const T dato); ... };

Orientacin a Objetos

Pgina 63

LENGUAJES DE PROGRAMACIN

De acuerdo a esto debemos especificar el tipo de lista que deseamos construir, Lista<int> lista-enteros; automticamente, el compilador interpreta el mtodo agregar como, void agregar(const int dato);

Tambin pueden ser definidas funciones template, por ejemplo, template <class T> void swap (T &a, T &b) { T tmp=a; a=b; b=tmp; }; y un posible programa sera

Orientacin a Objetos

Pgina 64

LENGUAJES DE PROGRAMACIN

int main() { int a=3; b=16; double p1=3.14; e=2.17; Persona yo (Luis Alvarez) tu (Juan Peres) swap(a,b); cout << a = << a << b = << b; swap(p1,e); cout << pi = << pi << e = << e; swap(yo,tu); cout << yo = << yo << tu = << tu; return(0); } template <class T> void swap (T &a, T &b) { T tmp=a; a=b; b=tmp; } El template puede tener mas de un argumento,
Orientacin a Objetos Pgina 65

LENGUAJES DE PROGRAMACIN

ejemplo, template <class K, class T> class Diccionario { ... public : ... K sacar_1(const T palabra_2); T sacar_2(const K palabra_1); ... } Template tambin puede ser usado para crear clases parametrizadas, ejemplo. template <class T, int tamao> class Stack { T _almacen[tamao]; public : ... }; Stack<int,128> mi_stack;

Orientacin a Objetos

Pgina 66

LENGUAJES DE PROGRAMACIN

Propiedades de listas simplemente enlazadas. 1. Elemento actual. Un iterador visita el elemento en uso. 2. Funcin sucesor. El iterador regresar el prximo elemento a ser visitado. 3. Condicin de trmino. El iterador debe proveer una condicin de trmino, no necesita chequear que todos los elementos hayan sido visitados.

Primer nodo o nodo cabeza. No tiene predecesor. Nodo del medio. Tiene predecesor y sucesor. ltimo nodo o cola. No tiene sucesor. Una lista solo tiene nodos. No es posible devolverse ni comenzar en la mitad de la lista. Cuales son la operaciones ofrecidas por una lista ? La lista tiene dos elementos bien conocidos que son la cabeza y cola.

Orientacin a Objetos

Pgina 67

LENGUAJES DE PROGRAMACIN

Un nuevo nodo puede ser colocado en la lista como: El puntero es fijado en la cabeza, en nuevo nodos es la nueva cabeza, En forma similar, un nodo puede ser facilmente agregado a la cola como: El puntero a la cola es fijado en el nuevo nodo, el nuevo nodo pasa a ser la cola. La funcion inversa en sacar (o borrar) el nodo sucesor pasa a ser la nueva cabeza, la antigua cabeza se descarta.

Tres primitivas permiten hacer lo anterior y son: saca-primero : retorna el datos del nodo cabeza, saca-ltimo esta-vaca : retorna el dato del nodo cola, : retorna verdadero o falso.

Orientacin a Objetos

Pgina 68

LENGUAJES DE PROGRAMACIN

Implantacin.El block bsico de una lista es el nodo. As la primera clase a declarar ser Nodo. Lo nico que contiene un nodo is un puntero al prximo vecino (a la derecha). Class Nodo { Nodo *_derecha; public : Nodo(Nodo *derecha=NULL) : _derecha(derecha) {} Nodo(const Nodo &val) : _derecha(val._derecha) {} const Node *derecha() const { return _derecha } Nodo *&derecha(){ return _derecha } Nodo &operador =(const Nodo &val) { _derecha=val._derecha; return *this; } const int operator == (const Nodo &val) const {return _derecha==val._derecha;} const int operator != (const Nodo &val) const {return !(*this==val); } }; La palabra const justo antes del cuerpo del mtodo, declara a ste como constante en relacin a los elementos del
Orientacin a Objetos Pgina 69

LENGUAJES DE PROGRAMACIN

objeto invocado. Consecuentemente, slo se permite usar este mecanismo en declaracin o definicin respectivamente. El modificador const tambin es usado para chequear sobrecarga. De esta forma, class Xxx { ... int xx() const; int xx() ; }; declara dos mtodos diferentes. El primero es usado en contextos constantes, mientras que el segundo en contextos variables. La clase Nodo implementa un nodo simple donde : Constructores. Permiten la definicin de objetos inicializados a partir de otros ya existentes. operator =. Cada objetos debe saber como asignar otros objetos (del mismo tipo) a si mismo. operador ==. Cada objeto deber saber como compararse con otro objetos. operador != . Se aplica usando en operador == y el puntero this.

Orientacin a Objetos

Pgina 70

LENGUAJES DE PROGRAMACIN

De esta forma podemos usar Node a,b; ... if (a!=b)... note que se usa el mismo operator == de la clase. Todos los nodos deben contener datos. Los datos pueden ser de cualquier tipo, para lo cual usaremos una clase template.
template <class T> class Data_Nodo : public Nodo { T _data; public: Data_Nodo(const T data, Data_Nodo *derecha=NULL) : Nodo(derecha), _data(data) {} Data_Nodo(const Data_Nodo &val) : Nodo(val), _data(val._data) {} const Data_Nodo *derecha() const { return((Data_Nodo *) Nodo::derecha());} ... ...

Orientacin a Objetos

Pgina 71

Das könnte Ihnen auch gefallen