Вы находитесь на странице: 1из 87

Programacin Orientada a Objetos

Unidad V Clases

M.C. Adrin Snchez Vidal

Objetivo
El estudiante distinguir los diferentes tipos de clases, herencia, interfaces y colecciones mediante la construccin de programas; para disear programas ms complejos.

ENUMERACIONES Trminos y Conceptos de POO


El esquema tradicional de un programa, independientemente del lenguaje que se utilice, est compuesto por una secuencia de sentencias, ms o menos agrupadas en rutinas o funciones, que van operando sobre una informacin contenida en campos o variables. El problema de esta estructura estriba en que ni las sentencias tienen un control de las variables con las que trabajan, ni estas variables estn relacionadas en forma alguna con las sentencias que habrn de tratarlas. Cmo puede la POO ayudarnos?

Programacin ENUMERACIONES

Orientada a Objetos

La filosofa de la POO (Object Oriented Programming, Programacin Orientada a Objetos) rompe con este esquema, dando lugar a una nueva idea, el objeto. El objeto es una abstraccin en la que se unen sentencias y datos, de tal forma que a un objeto slo lo van a poder tratar los mtodos definidos para l, y estos mtodos estn preparados para trabajar especficamente con l.

Programacin ENUMERACIONES

Orientada a Objetos

Este grado de compenetracin evita que un mtodo pueda tratar datos no apropiados, o bien que unos datos puedan ser tratados por un mtodo no adecuado, ya que la llamada a cualquier mtodo ha de ir siempre precedida del objeto sobre el que se quiere actuar, y ste sabe si ese mtodo se ha definido o no para l. C++ es un lenguaje que contiene estos y otros conceptos de POO.

Programacin ENUMERACIONES

Orientada a Objetos

En terminologa POO, cuando se quiere ejecutar un mtodo (funcin) sobre un objeto, se utiliza un mensaje que se enva al objeto, de tal forma que el objeto llame al mtodo y ste sepa qu objeto lo ha llamado.

ENUMERACIONES Clases
Las clases permiten que el programador modele objetos que tienen atributos (miembros de datos) y comportamientos u operaciones (funciones miembro). El nombre de la clase (una vez definida) puede ser utilizado para declarar objetos de dicha clase. Una clase es una definicin de operaciones que se define una vez en algn punto del programa, pero normalmente se define en un archivo cabecera, asignndole un nombre que se podr utilizar ms tarde para definir objetos de dicha clase.

ENUMERACIONES Clases
Las clases se crean usando la palabra clave class, y su sintaxis es la siguiente: class Nombre_de_la_Clase { Definicin_de_Atributos; Prototipos_y_mtodos; };

Nota: Muy importante no olvidar el punto y coma final.

ENUMERACIONES Clases
Ejemplo:
class Punto // Declaracin de la clase Punto. { int _x, _y; // Coordenadas del punto. public: // Principio de la declaracin // de interface. void setX (const int val); void setY (const int val); int getX( ) {return _x;} int getY( ) {return _y;} }; Punto apunto; // Definicin del objeto apunto.

ENUMERACIONES Clases
Un objeto es una instancia de una clase. Puede ser identificado en forma nica por su nombre y define un estado, el cul es representado por los valores de sus atributos en un momento en particular. Todos los atributos que forman parte de una clase deben ser declarados dentro de la misma. El estado de un objeto cambia de acuerdo a los mtodos que le son aplicados. Nos referimos a esta posible secuencia de cambios de estado como el comportamiento del objeto

ENUMERACIONES Clases
Cuando deseemos crear un objeto de una clase definida lo que haremos ser lo siguiente: Nombre de la Clase Nombre del Objeto;

Punto p1,p2; // Creacin de dos objetos // de la clase Punto

ENUMERACIONES Clases
Tambin se pueden definir apuntadores a objetos de la siguiente forma: Nombre de la Clase *Nombre del Objeto;

Punto p1,p2; // Creacin de dos objetos // de la clase Punto


Se puede acceder a los datos y mtodos de una clase de la misma forma que se accede a un campo de una estructura, es decir, con . o con ->, seguido del nombre del elemento a usar.

Miembros Pblicos, ENUMERACIONES

Protegidos y Privados

Un miembro pblico es accesible en cualquier lugar en el que exista un objeto de la clase. Un miembro protegido slo es accesible desde las clases que se hereden de la clase que lo contiene. Un miembro privado slo es accesible por los mtodos de la clase a la que pertenece.

Tambin se puede crear una clase usando la palabra clave struct, la diferencia es que con struct los miembros se hacen pblicos por omisin, mientras que con class se hacen privados por omisin.

Miembros Pblicos, ENUMERACIONES

Protegidos y Privados

Normalmente, se trata de que los atributos de la clase sean privados; as como los mtodos que no sean necesarios externamente o que puedan conducir a un estado inconsistente del objeto.
En el caso de los atributos, estos al ser privados deberan de contar con mtodos de modificacin y de consulta pudiendo incluir alguna validacin. Es una buena costumbre de programacin accesar a los atributos solamente a travs de las funciones de modificacin, sobre todo si es necesario algn tipo de verificacin sobre el valor del atributo.

Miembros Pblicos, ENUMERACIONES

Protegidos y Privados

Para hacer un miembro pblico, privado o protegido usamos respectivamente:


public, private o protected

ENUMERACIONES Mtodos Inline


El cuerpo de un mtodo, puede o bien incluirse en la definicin de una clase, en cuyo caso lo llamaremos mtodo inline, o bien en un archivo fuera de la clase. Para que C++ sepa cundo una funcin es simplemente una funcin, y cundo es un mtodo, en ste ltimo caso siempre debemos poner al mtodo como prefijo el nombre de la clase a la que pertenece seguido de :: (operador de mbito).

ENUMERACIONES Mtodos Inline


Ejemplo: (Mtodos definidos dentro de la clase)
class Celdilla { char Caracter, Atributo; //Miembros privados public: void FijaCeldilla(char C, char A) { Caracter=C; Atributo=A; } void ObtenCeldilla(char &C, char &A) { C=Caracter; A=Atributo; } //&C es una referencia a la variable C };

ENUMERACIONES Mtodos Inline


En la definicin de la clase anterior pueden verse dos variantes, en la primera los mtodos se definen dentro de la misma clase, mientras que en la segunda slo se incluye en la clase un prototipo de los mtodos, su implementacin est fuera. Los mtodos cuya definicin se incluye en la clase se denominan Mtodos inline. En el caso de emplear mtodos inline, vamos a tener como beneficio que la ejecucin va a ser ms rpida, pero sin embargo, el cdigo objeto que genera el compilador va a ser mayor.

ENUMERACIONES Mtodos Inline


En algunos compiladores puede que no suceda esto, pero normalmente suele ocurrir. As, a la conclusin a la que podemos llegar es que, para mtodos pequeos, el mtodo Inline si es ptimo, pero en caso contrario no lo ser.

ENUMERACIONES Mtodos Inline


Ejemplo: (Clase con mtodos no Inline)
class Celdilla { char Caracter, Atributo; public: void FijaCeldilla(char C, char A); void ObtenCeldilla(char &C, char &A); }; void Celdilla::FijaCeldilla(char C, char A) { Caracter=C;Atributo=A; } void Celdilla::ObtenCeldilla(char &C, char &A) { C=Caracter;A=Atributo; }

ENUMERACIONES Entrada y Salida Bsica


cin y cout son dos flujos (entrada y salida) de datos pertenecientes a la biblioteca de C++ llamada iostream.h, y se utilizan para lo siguiente: cin>>dato : Almacena el carcter introducido por teclado en dato. cout<<dato : Lee el contenido de dato y lo muestra por pantalla.

Funciones miembro ENUMERACIONES

y objetos constantes

const un objeto declarado como constante no puede ser modificado: const CFecha cumpleanyos; Cuando se enva un mensaje a un objeto constante dicha funcin tambin debe ser declarada constante: cumpleanyos.FechaCorrecta();

Funciones miembro ENUMERACIONES

y objetos constantes

Declaracin
class CFecha { //Datos y funciones miembro int FechaCorrecta() const; };

Definicin
int CFecha::FechaCorrecta() const { //cuerpo_de_la_fn }

ENUMERACIONES Clases
Ejemplo 1:
#include <iostream.h> class CFecha { private: int dia, mes, anyo; protected: int Bisiesto() const; public: void AsignarFecha(); void ObtenerFecha( int *, int *, int * ) const; int FechaCorrecta() const; };

ENUMERACIONES Clases
void CFecha::AsignarFecha() { cout << "da, ## : "; cin >> dia; cout << "mes, ## : "; cin >> mes; cout << "ao, #### : "; cin >> anyo; } void CFecha::ObtenerFecha(int *pd, int *pm, int *pa) const { *pd = dia, *pm = mes, *pa = anyo; }

ENUMERACIONES Clases
int CFecha::FechaCorrecta() const { int DiaCorrecto, MesCorrecto, AnyoCorrecto; // ao correcto? AnyoCorrecto = ( anyo >= 1582); // mes correcto? MesCorrecto = ( mes >= 1 ) && ( mes <= 12 ); switch ( mes ) // da correcto? { case 2: if ( Bisiesto() ) DiaCorrecto = (dia >= 1 && dia <= 29); else DiaCorrecto = (dia >= 1 && dia <= 28); break;

ENUMERACIONES Clases
case 4: case 6: case 9: case 11: DiaCorrecto = ( dia >= 1 && dia <= 30 ); break; default: DiaCorrecto = ( dia >= 1 && dia <= 31 ); } if ( !( DiaCorrecto && MesCorrecto && AnyoCorrecto ) ) { cout << "\ndatos no vlidos\n\n"; return 0; // fecha incorrecta } else return 1; // fecha correcta }

ENUMERACIONES Clases
void VisualizarFecha( const CFecha &fecha );

void main() { CFecha fecha; // fecha es un objeto de tipo CFecha do fecha.AsignarFecha(); while (!fecha.FechaCorrecta()); VisualizarFecha( fecha ); } void VisualizarFecha( const CFecha &fecha ) { int dd, mm, aa; fecha.ObtenerFecha( &dd, &mm, &aa ); cout << dd << "/" << mm << "/" << aa << "\n"; }

ENUMERACIONES Clases
int CFecha::Bisiesto() const { if ( (anyo % 4 == 0) && (anyo % 100 != 0) || (anyo % 400 == 0)) return 1; // ao bisiesto else return 0; // ao no bisiesto }

ENUMERACIONES Sobrecarga
Consiste en la redefinicin de un mtodo. Por tanto, un mtodo sobrecargado es un mtodo que consta de varias definiciones distintas, aunque todas ellas llamadas de igual forma. Lo que va a permitir distinguir un mtodo de otro que se llame de igual forma van a ser el tipo y el nmero de parmetros que recibe.

ENUMERACIONES Sobrecarga
Ejemplo 2:
#include <iostream.h> class Celdilla { char Caracter, Atributo; public: void FijaCeldilla(char C, char A) { Caracter=C; Atributo=A; } void FijaCeldilla(unsigned CA) { Caracter=CA & 0xff; Atributo=CA >> 8; }

ENUMERACIONES Sobrecarga
void ObtenCeldilla(char &C, char &A) { C=Caracter; A=Atributo; } unsigned ObtenCeldilla() { return Atributo<<8 | Caracter; } }; // Se cierra la clase

ENUMERACIONES Sobrecarga
void main() { Celdilla unsigned char

X, Y; Casilla; C, A;

X.FijaCeldilla(A,112); // Fija los valores del // objeto X Casilla = X.ObtenCeldilla(); //Obtiene el valor // de X en forma // de un entero Y.FijaCeldilla(Casilla); //Toma Y en dos caract. cout <<"Caracter=" << C << ", Atributo= " << (int) A; }

ENUMERACIONES Constructores y Destructores


Cada vez que se define una variable de un tipo bsico, el programa ejecuta un procedimiento que se encarga de asignar la memoria necesaria, y si es necesario, tambin realizar las inicializaciones pertinentes. De forma complementaria cuando una variable queda fuera de mbito se llama aun procedimiento que libera el espacio que estaba ocupando dicha variable. El mtodo al que se llama cuando creamos una variable es el constructor, y al que se llama cuando se destruye una variable es el destructor.

ENUMERACIONES Constructores y Destructores


Una clase puede tener uno o varios constructores, pero un slo destructor. El constructor debe tener el mismo nombre que la clase a la que pertenece, mientras que el destructor tambin debe llamarse de igual forma pero precedido por el carcter ~.
Estos mtodos no van a tener parmetros de salida, ni siquiera puede usarse void. Sin embargo, el constructor s podra tomar parmetros de entrada, cosa que no puede hacer el destructor. Si no lo declaramos, se tiene uno por omisin.

ENUMERACIONES Constructores y Destructores


CONSTRUCTOR
Declaracin
class CFecha { // CFecha(int dd, int mm, int aa); };

Definicin
int CFecha::CFecha(int dd, int mm,int aa) { dia=dd; mes=mm; anyo=aa; }

Llamada
CFecha hoy(10, 2, 2003);

ENUMERACIONES Constructores y Destructores


Ejemplo:
class cCola{ private: int q[100]; int sloc, rloc; public: cCola( ); //constructor void put(int); int get( ); };
//Implementacin del constructor cCola::cCola ( ) { sloc=rloc=0; cout<<"Cola inicializada \n"; }

ENUMERACIONES Constructores y Destructores


Destructor
La contraparte del constructor es el destructor. Este se ejecuta momentos antes de que el objeto sea destruido, ya sea porque salen de su mbito o por medio de una instruccin delete. El uso ms comn para un destructor es liberar la memoria asignada dinmicamente, aunque puede ser utilizado para otras operaciones de finalizacin, como cerrar archivos, una conexin a red, etc.

ENUMERACIONES Constructores y Destructores


El destructor tiene al igual que el constructor el nombre de la clase pero con una tilde como prefijo (~). El destructor tampoco regresa valores ni tiene parmetros.

ENUMERACIONES Constructores y Destructores


Ejemplo:
class cCola{ private: int q[100]; int sloc, rloc; public: cCola( ); //constructor ~cCola(); //destructor void put(int); int get( ); };
cCola::~cCola( ){ cout<<"cola destruida\n"; }

Constructores y Destructores
Ejercicio 1.

TIEMPO: 20 MIN

Desarrollar un Objeto fecha a partir de una clase CFecha (con atributos: int dia, mes, anyo) que contenga los mtodos CFecha (constructor), as como VisualizarFecha y ObtenerFecha usados en ejemplos anteriores. De modo que se compruebe en la funcin principal que al crear el objeto sin inicializar sus atributos, se visualice que fueron inicializados por el constructor con sus valores por default. Adems, al destruirse el objeto muestre el mensaje en pantalla "Objeto destruido\n ".

ENUMERACIONES Asignacin Dinmica de Memoria


Se llama Asignacin Dinmica de Memoria al proceso mediante el cual, se va reservando memoria a medida que vaya haciendo falta, y se va liberando cuando ya no sea til. Algunos ejemplos son los vistos antes con new y delete. Un objeto tambin se puede crear explcitamente por medio del operador new, que asignar la memoria necesaria para contener al objeto y devolver un puntero al objeto en cuestin.

ENUMERACIONES Asignacin Dinmica de Memoria


Ej.: Cadena *C=new Cadena;

El operador new siempre va seguido de un parmetro que indica el tipo de objeto que se quiere crear. De este parmetro, new obtiene el nmero de bytes necesarios para almacenar el objeto, y a continuacin buscar un bloque de memoria apropiado, lo asigna al programa y devuelve su direccin. En este caso, accederemos a los miembros de la clase mediante el operador ->, y por medio de * accedemos al contenido.

ENUMERACIONES Asignacin Dinmica de Memoria


Lo que ocurre es que un objeto creado con new no se destruir automticamente cuando quede fuera de su mbito, sino que ha de usarse para liberar memoria el comando delete.
Al crear un objeto con new detrs del nombre de la clase se le puede hacer una asignacin ponindola entre parntesis.

ENUMERACIONES Miembros Estticos


Cada objeto tiene su propio estado, pero a veces es necesario tener valores por clase y no por objeto. En esos casos es necesario tener atributos estticos que sean compartidos por todos los objetos de la clase. Existe solo una copia de un miembro esttico y no forma parte de los objetos de la clase.

ENUMERACIONES Miembros Estticos

ENUMERACIONES Miembros Estticos


Ejemplo 3:
#include #include #include #include <iostream> <stdio.h> <conio.h> <string.h>

using namespace std;


class cPersona{ private: static int nPersonas; // Es modificable static const int MAX; // No se modifica char *nombre;

ENUMERACIONES Miembros Estticos


public: cPersona(char *c=NULL){ if(c!=NULL){ nombre= new char[strlen(c)+1]; strcpy(nombre, c); }else nombre=NULL; cout<<"Persona: "<<nombre<<endl; nPersonas++; } ~cPersona(){ cout<<"Eliminando persona : "<<nombre<<endl; if(nombre) delete []nombre; nPersonas--; }

ENUMERACIONES Miembros Estticos


static int return } static int return } getMax(){ MAX; getnPersonas(){ nPersonas;

};
int cPersona::nPersonas=0; const int cPersona::MAX=10;

int main() { cout<<"Max. de personas clase: "<<cPersona::getMax()<<endl; cout<<"Num. de personas de la clase: "<<cPersona::getnPersonas()<<endl;

ENUMERACIONES Miembros Estticos


cPersona per1("Persona 1"); cout<<"Maximo de personas: "<<cPersona::getMax()<<endl; cout<<"Numero de personas: "<<cPersona::getnPersonas()<<endl; cPersona per2("Persona 2"); cout<<"Maximo de personas: "<<per2.getMax()<<endl; cout<<"Numero de personas: "<<per2.getnPersonas()<<endl; }

ENUMERACIONES Objetos Compuestos


Algunas veces una clase no puede modelar adecuadamente una entidad basndose nicamente en tipos de datos simples. Los LPOO permiten a una clase contener objetos. Un objeto forma parte directamente de la clase en la que se encuentra declarado. El objeto compuesto es una especie de relacin, pero con una asociacin ms fuerte con los objetos relacionados. A la nocin de objeto compuesto se le conoce tambin como objeto complejo o agregado.

ENUMERACIONES Objetos Compuestos


Ejemplo: Un automvil se puede considerar ensamblado o agregado, donde el motor y la carrocera serian sus componentes. El concepto de agregacin puede ser relativo a la conceptualizacin que se tenga de los objetos que se quieran modelar. Hay que tener en cuenta que pasa con los objetos que son parte del objeto compuesto cuando ste ltimo se destruye.

ENUMERACIONES Objetos Compuestos


En general hay dos opciones: 1. Cuando el objeto agregado se destruye, los objetos que lo componen no tienen necesariamente que ser destruidos. 2. Cuando el agregado es destruido tambin sus componentes se destruyen. Nosotros consideraremos la segunda opcin, por ser ms fcil de implementar y es la accin natural de los objetos que se encuentran embebidos como un atributo ms una clase.

ENUMERACIONES Objetos Compuestos


Ejemplo:
class Nombre { private: char paterno[20], materno[20], nom[15]; public: set(char *, char*, char *); ... };
class Persona { private: int edad; Nombre nombrePersona; .... };

ENUMERACIONES Objetos Compuestos


Al crear un objeto compuesto, cada uno de sus componentes es creado con sus respectivos constructores. Para inicializar esos objetos componentes tenemos dos opciones: 1. En el constructor del objeto compuesto llamar a los mtodos set correspondientes a la modificacin de los atributos de los objetos componentes. 2. Pasar en el constructor del objeto compuesto los argumentos a los constructores de los objetos componentes.

ENUMERACIONES Objetos Compuestos


Sintaxis:
<clase>::<constructor>(<lista de argumentos>) : <objeto componente 1>(<lista de argumentos sin el tipo>),...

donde la lista de argumentos del objeto compuesto debe incluir a los argumentos de los objetos componentes, para que puedan ser pasados en la creacin del objeto.

ENUMERACIONES Objetos Compuestos


Ejemplo 4:
#include <stdio.h> #include <string.h> #include <iostream>
using namespace std; class cNombre { // Clase de Objeto Componente char *nombre, *paterno, *materno; public: cNombre(char *n, char *p, char*m){ nombre=new char[strlen(n)+1]; paterno=new char[strlen(p)+1]; materno=new char[strlen(m)+1];

ENUMERACIONES Objetos Compuestos


strcpy(nombre, n); strcpy(paterno, p); strcpy(materno, m);
} ~cNombre(){ delete []nombre, paterno, materno; cout<<"destructor de cNombre"<<endl;} }; class cPersona{ // Clase de Objeto Compuesto cNombre miNombre; // Objeto Componente int edad; public: cPersona(char *n, char *p, char*m): miNombre(n, p, m){ edad=0;} };

ENUMERACIONES Objetos Compuestos


int main() { cPersona *per1; // Objetos Compuestos per1= new cPersona("uno", "dos", "tres"); cPersona per2("carlos alberto", "fernandez y","fernandez"); delete per1; // Destruye a per1 cout<<"destruido antes"<<endl; // Destructor elimina a per2 al cerrar main }

ENUMERACIONES Objetos Compuestos


Ejercicio 2: Modificar el ejemplo de clase 4, de modo que despliegue en pantalla los valores de los atributos de cada objeto creado. TIEMPO: 20 MIN

ENUMERACIONES Asociaciones entre clases


Una clase puede estar relacionada con otra clase, o en la prctica un objeto con otro objeto. En el modelado de objetos a la relacin entre clases se le conoce como asociacin; mientras que a la relacin entre objetos se le conoce como instancia de una asociacin. Ejemplo:

Una clase estudiante est relacionada con una clase Universidad

ENUMERACIONES Asociaciones entre clases


Una relacin es una conexin fsica o conceptual entre objetos. Las relaciones se consideran de naturaleza bidireccional; es decir, ambos lados de la asociacin tienen acceso a clase del otro lado de la asociacin. Sin embargo, algunas veces nicamente es necesario una relacin en una direccin (unidireccional).

ENUMERACIONES Asociaciones entre clases


Comnmente las asociaciones se representan en los LPOO como apuntadores. Donde un apuntador a una clase B en una clase A indicara la asociacin que tiene A con B; aunque no as la asociacin de B con A. Para una asociacin bidireccional es necesario al menos un par de apuntadores, uno en cada clase. Para una asociacin unidireccional basta un solo apuntador en la clase que mantiene la referencia.

ENUMERACIONES Asociaciones entre clases


Ejemplo: Un programa que guarda una relacin bidireccional entre clases A y B.
class A{ //lista de atributos B *pB; }; class B{ //lista de atributos A *pA; };

ENUMERACIONES Asociaciones entre clases


En el ejemplo anterior se presenta una relacin bidireccional, por lo que cada clase tiene su respectivo apuntador a la clase contraria de la relacin. Adems, deben proporcionarse mtodos de acceso a la clase relacionada por medio del apuntador. En el caso de las relaciones se asumir que cada objeto puede seguir existiendo de manera independiente, a menos que haya sido creado por el objeto de la clase relacionada, en cuyo caso deber ser eliminado por el destructor del objeto que la creo.

ENUMERACIONES Asociaciones entre clases


Es decir:

Si el objeto A crea al objeto B, es responsabilidad de A eliminar a la clase B antes de que A sea eliminada. En caso contrario, si B es independiente de la clase A, A debera enviar un mensaje al objeto B para que asigne NULL al apuntador de B o para que tome una medida pertinente, de manera que no quede apuntando a una direccin invlida.

ENUMERACIONES Asociaciones entre clases

Es importante sealar que las medidas que se tomen pueden variar de acuerdo a las necesidades de la aplicacin, pero bajo ningn motivo se deben dejar accesos a reas de memoria no permitidas o dejar objetos "volando", sin que nadie haga referencia a ellos.

ENUMERACIONES El Objeto this

Permite acceder al objeto actual cuyo comportamiento se est definiendo. Es un apuntador a una clase usado dentro de cualquier mtodo de dicha clase, por ejemplo:

this->Imprime()

ENUMERACIONES El Objeto this

Permite acceder al objeto actual cuyo comportamiento se est definiendo. Es un apuntador a una clase usado dentro de cualquier mtodo de dicha clase, por ejemplo:

this->Imprime()

ENUMERACIONES Clases con miembros punteros


El puntero requiere de una asignacin de memoria. Esto se hace en el constructor. Es necesario implementar adecuadamente: El constructor copia El operador de asignacin El destructor

ENUMERACIONES Clases con miembros punteros


Ojo! Hay que verificar si hay lagunas de memoria. Hay que usar la funcin: int _CrtDumpMemoryLeaks( void ); 0 no hay lagunas Valor distinto de 0 s hay

ENUMERACIONES Clases con miembros punteros


Ejemplo 5:
#include #include #include #include <stdio.h> <string.h> <iostream> <stdlib.h>

using namespace std; class CVector { private: int *pVector; int nElementos; protected: void ErrorMem();

ENUMERACIONES Clases con miembros punteros


public: CVector(); CVector(int ne); CVector( const CVector & ); CVector &operator=(const CVector &); ~CVector() { delete [] pVector; } int &ObtenerElemento( int i ) const { return pVector[i]; } int ObtenerNumElementos() const { return nElementos; } };

ENUMERACIONES Clases con miembros punteros


CVector::CVector() { nElementos = 10; pVector = new int[nElementos]; if (pVector == 0) ErrorMem(); else memset(pVector, 0, nElementos * sizeof(int));}

CVector::CVector( const CVector &v ) { nElementos = v.nElementos; pVector = new int[nElementos]; if (pVector == 0) ErrorMem(); // Copiar el objeto v for ( int i = 0; i < nElementos; i++ ) pVector[i] = v.pVector[i];}

ENUMERACIONES Clases con miembros punteros


CVector::CVector( int ne ) { if ( ne < 1 ) { cerr << "N de elementos no vlido: " << ne << "\n"; return;} nElementos = ne; pVector = new int[nElementos]; if (pVector == 0) ErrorMem(); else memset(pVector, 0, nElementos * sizeof(int));} void CVector::ErrorMem() { cout << "Insuficiente memoria\n"; exit(-1); }

ENUMERACIONES Clases con miembros punteros

void fnVisualizar( const CVector & );


void fnVisualizar( const CVector &Vector ) { int ne = Vector.ObtenerNumElementos(); for (int i = 0; i < ne; i++) cout << Vector.ObtenerElemento( i ); cout << "\n\n"; }

ENUMERACIONES Clases con miembros punteros


CVector & CVector::operator=(const CVector &v) { delete [] pVector; nElementos = v.nElementos; pVector = new int[nElementos]; if (pVector == 0) ErrorMem(); // Copiar el objeto v for ( int i = 0; i < nElementos; i++ ) pVector[i] = v.pVector[i]; return *this; }

ENUMERACIONES Clases con miembros punteros


int main() { CVector Vector1, Vector2(5); fnVisualizar( Vector1 ); fnVisualizar( Vector2 ); CVector Vector3 = Vector2; fnVisualizar( Vector3 ); cout << "fin del programa\n"; }

ENUMERACIONES Clases con miembros punteros


Ejercicios de Tarea:
1. Genere una clase llamada Libro con los siguientes atributos:
NOMBRE editorial titulo num_pag precio TIPO Apuntador de char esttico Arreglo de 40 caracteres Entero Flotante

ENUMERACIONES Clases con miembros punteros


Y adems contenga los siguientes mtodos:
MTODO TIPO N/A N/A Void Void esttico

Constructor Destructor Set_Datos(char *, int, float) Imprimir()

NOTA: Respete el nombre de los atributos y mtodos a excepcin del constructor y destructor, cuyo nombre bsico debe seguir las reglas vistas en clase.

ENUMERACIONES Clases con miembros punteros


2. Escriba el constructor y destructor de la clase Libro definida en el ejercicio 1, cumpliendo las caractersticas: I. Constructor. a) Primeramente debe imprimir en pantalla el texto Constructor invocado. b) Cree un nuevo objeto editorial editorial = new char [40]. c) Inicialice la editorial con el valor Prentice Hall. d) Que inicialice los dems atributos en ceros o en blanco para el caso de los char.

ENUMERACIONES Clases con miembros punteros

II. Destructor. a) Primeramente que borre el atributo editorial. b) Imprima en pantalla el texto Destructor invocado.

ENUMERACIONES Clases con miembros punteros


3. Anexe los ejercicios anteriores en el siguiente programa e implemente la funcin main, la cual debe realizar lo siguiente: a) Primero debe crear el objeto L1 de clase Libro. b) Inicialice los atributos de L1 con los siguientes valores titulo=C++, num_pag=650, precio=300, haciendo uso del mtodo Set_Datos. c) Imprima los valores de L1 usando el mtodo Imprimir. d) Posteriormente cambie nicamente la editorial de L1 de Prentice Hall a McGrawHill, empleando el mtodo CambiarEditorial.

ENUMERACIONES Clases con miembros punteros


e) Finalmente, nuevamente imprima en pantalla L1 con sus nuevos valores.
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; class Libro { }; CONSTRUCTOR DESTRUCTOR

ENUMERACIONES Clases con miembros punteros


void Libro::Set_Datos(char *t, int n, float p) { strcpy(this->titulo, t); this->num_pag = n; this->precio = p; } void Libro::Imprimir() {
cout<<"Editorial: " << this->editorial << endl; cout<<"Titulo: " << this->titulo << endl; cout<<"No. de pagina: "<< this->num_pag << endl;

cout<<"Precio: " << this->precio << endl; }

ENUMERACIONES Clases con miembros punteros


void Libro::CambiarEditorial(char *e) { delete editorial; editorial = new char [strlen(e)+1]; strcpy(editorial, e); }

char *Libro::editorial = NULL;


int main() {

Bibliografa

1. Cmo programar C++, 6 Edicin, P. J. Deitel / H. M. Deitel. Editorial Prentice Hall. 2. Cmo programar C#, 2 Edicin, P. J. Deitel / H. M. Deitel. Editorial Prentice Hall. 3. Programacin en C++, 2 Edicin, Luis Joyanes Aguilar. Editorial Mc Graw Hill. 4. Manual de Referencia C, 4 Edicin, Herbert Schildt. Editorial Mc Graw Hill.