Sunteți pe pagina 1din 4

1 Implementacin de clases

La traduccin a C++ de una clase sigue los mismos pasos que la implementacin de un mdulo de datos, es decir, hay que obtener una representacin de la misma a partir de las clases ya existentes y, a continuacin, codicar sus operaciones en C++. Recordemos que para garantizar que la clase sea independiente de su implementacin, el acceso a los atributos de sus objetos ha de estar prohibido, salvo si se realiza mediante las operaciones de modicacin y consulta (la mayora de lenguajes proporciona mecanismos para eludir esta prohibicin; en otros contextos su uso puede ser ventajoso pero aqu no lo permitiremos). Como ya hemos mencionado, necesitamos dos cheros: el .hpp, que ha de contener al menos las cabeceras de las operaciones y cierta informacin sobre la representacin de la clase, y el .cpp, que ha de incluir al menos el cdigo de las operaciones. En la implementacin ya conocida de la clase Estudiante, el chero Estudiante2.hpp apenas hace mencin de los campos de la clase y casi toda la informacin relevante est oculta en el chero Estudiante2.cpp. Esta tcnica requiere conocimientos de C++ que sobrepasan los objetivos de esta asignatura, pero es interesante haber visto un ejemplo de ella. En vuestras clases no ocultaris los campos pero al menos los declararis privados en los cheros .hpp, como veremos a continuacin. En el ejemplo de la clase Estudiante, comenzamos por el chero Estudiante.hpp. Las cabeceras de las operaciones son las mismas que en la versin anterior y se declaran igualmente pblicas. En cuanto a los campos, recordemos que haba un campo entero para el DNI, otro real para la nota y otro booleano para saber si la nota est denida. Todo ellos son declarados private para obligar a que el acceso a los mismos desde fuera de la clase se realice mediante las operaciones correspondientes. Para limitar el conjunto de notas vlidas, introducimos una constante MAX_NOTA, que adems ser declarada static (ya que si no, cada objeto tendra su propia constante como atributo). Notad que no se ha de usar el equivalente en C++ al constructor de tipos tupla, es decir, struct. Si necesitamos tuplas auxiliares (es decir, una tupla que forma parte de otra tupla), entonces s que emplearemos un struct. Es interesante notar que las asignaciones entre miembros de una clase en realidad se descomponen simplemente en asignaciones campo a campo. En este caso, como los campos son de tipos simples, las asignaciones de los estudiantes implementados no generan aliasing. Por lo tanto, ya no necesitamos introducir el operador correspondiente,
#ifndef ESTUDIANTE_HPP #define ESTUDIANTE_HPP class Estudiante { private: int DNI; double nota; bool tieneNota;

static const int MAX_NOTA = 10; public: /* Constructoras */ Estudiante(); /* Destructora por defecto */ ~Estudiante(); /* Consultoras de los campos */ bool tiene_nota() const; double consultar_nota() const; int consultar_DNI() const; /* Modificadoras de los campos */ void crear_estudiante(int dni); void anadir_nota(double nota); void modificar_nota(double nota); /* Entrada / Salida */ void leer_estudiante(); void escribir_estudiante() const; }; #endif

Pasemos al chero Estudiante.cpp, donde codicamos los mtodos. Notad que en todas las cabeceras hay que insertar la declaracin Estudiante:: delante del nombre de cada operacin. As queda establecido que se trata de la misma operacin que consta en el chero Estudiante.hpp. En otros ejemplos ms complejos, veremos que las operaciones que no incluyan la mencionada declaracin se consideran automticamente como operaciones privadas. En las instrucciones de un mtodo ser necesario referirse al parmetro implcito: para ello C++ reserva la palabra this. Hay que notar que sta no es siempre obligatoria: si mencionamos el nombre de un campo de la clase, C++ interpreta que nos referimos al correspondiente campo del parmetro implcito. Sin embargo, en casos como los de las operaciones aadir_nota y modificar_nota en los que existe la posibilidad de confusin entre el campo nota y el parmetro del mismo nombre, el uso del this es imprescindible. Tambin lo es cuando se hace referencia al parmetro implcito en su conjunto, por ejemplo, si se necesita pasarlo como parmetro no implcito de alguna operacin. Por ltimo, veris que algunos mtodos lanzan excepciones para controlar situaciones no previstas en la precondicin, cada una con un texto explicativo (ER1,...,ER4, denidos en el .cpp). En general, no pediremos que lo hagis as en vuestros programas, sino que bastar con comprobar que una precondicin se cumple antes de usar la correspondiente operacin. 2

Comenzamos con la creadora que genera un estudiante vaco y la destructora por defecto. Las dems posibilidades quedan como ejercicio.
Estudiante::Estudiante(){} Estudiante::~Estudiante(){}

Entre las modicadoras tenemos las operaciones crear_estudiante y las dos operaciones que se encargan de la nota. Se vern otras opciones en los ejercicios.
void Estudiante::crear_estudiante(int dni) { if (dni<0) throw PRAPExcepcio(ER4); DNI = dni; tieneNota = false; } void Estudiante::anadir_nota(double nota) { if (tieneNota) throw PRAPExcepcio(ER3); if (nota < 0 or nota > MAX_NOTA) throw PRAPExcepcio(ER2); this->nota = nota; tieneNota = true; } void Estudiante::modificar_nota(double nota) { if (not tieneNota) throw PRAPExcepcio(ER1); if (nota < 0 or nota > MAX_NOTA) throw PRAPExcepcio(ER2); this->nota = nota; }

Pasemos a las operaciones consultoras. En este ejemplo, slo tenemos las consultas a los valores de los campos, pero en otras situaciones podramos necesitar clculos ms complicados.
bool Estudiante::tiene_nota() const { return tieneNota; }

double Estudiante::consultar_nota() const { if (!tieneNota) throw PRAPExcepcio(ER1); return nota; } int Estudiante::consultar_DNI() const { return DNI; }

Por ltimo, las operaciones de lectura y escritura:


void Estudiante::leer_estudiante() { crear_estudiante(readint()); double x = readdouble(); if (x>=0 && x<=10) anadir_nota(x); } void Estudiante::escribir_estudiante() const { if (tieneNota) cout << DNI << " " << nota << endl; else cout << DNI <<" NP" << endl; }

S-ar putea să vă placă și