Beruflich Dokumente
Kultur Dokumente
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Gestin de memoria dinmica Atributos y mtodos de clase Implementacin de relaciones entre objetos Pruebas unitarias
C++
FUNCIONES AMIGAS Funcin Amiga: Funcin NO miembro de una clase, que puede tener acceso a la parte privada de esa clase. Rompe el principio de encapsulacin. Una funcin se declara como amiga de una clase mediante la palabra reservada friend.
class MiClase { friend void unaFuncionAmiga(int, MiClase&); public: //... private: int datoPrivado; };
3
C++
FUNCIONES AMIGAS
void unaFuncionAmiga(int x, MiClase& c) { c.datoPrivado = x; // OK! } int main() { MiClase objeto; unaFuncionAmiga(10,objeto); }
Conceptualmente, las funciones amigas forman parte de la interfaz de una clase (tanto como las funciones miembro).
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Gestin de memoria dinmica Atributos y mtodos de clase Implementacin de relaciones entre objetos Pruebas unitarias
C++
BIBLIOTECA ENTRADA/SALIDA ifstream y ofstream son en realidad clases. La biblioteca iostream (#include <iostream>) define otras clases (ms generales) para los flujos de entrada y salida:
Nota: Las operaciones de lectura y escritura sobre streams que se presentan a continuacin funcionan para cualquier objeto de tipo istream/ostream (no slo cin y cout).
9
C++
Operador << cout << 17; Se pueden concatenar llamadas cout << x << y; Algunas operaciones:
Indicar el carcter de relleno: cout.fill(*); // por defecto, espacio en blanco Especificar el nmero mnimo de caracteres para la prxima operacin de salida: cout.width(4); // por defecto, cero
C++
13
C++
c=cin.get(); // cin.get(c)
14
C++
BIBLIOTECA ENTRADA/SALIDA
Operaciones de entrada para cadenas
string s; cin >> s;
Salta espacios. Almacena caracteres en s hasta encontrar un espacio en blanco o el final del fichero.
Con string:
getline(istream& is, string s); Lee una lnea completa de la entrada y la almacena en s (no almacena el salto de lnea final) 15
C++
BIBLIOTECA ENTRADA/SALIDA
Otras operaciones de entrada
cin.ignore()
cin.ignore(int ncar)
descarta ncar caracteres como mximo hasta llegar al delimitador (que tambin se descarta)
Los mtodos ignore() son tiles para limpiar el flujo de entrada tras un error de lectura.
16
C++
cin.fail() : devuelve cierto si ha habido algn error al leer la entrada cin.eof() : devuelve cierto si se ha alcanzado el final del fichero (se ha intentado leer cuando no haba nada en el buffer de entrada) cin.clear() : recupera al stream del estado "fail".
C++
19
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Gestin de memoria dinmica Atributos y mtodos de clase Implementacin de relaciones entre objetos Pruebas unitarias
24
C++
SOBRECARGA DE FUNCIONES
En C++ varias funciones pueden utilizar el mismo nombre (selector) en el mismo mbito, distinguindose por el nmero y tipo de sus argumentos. Estas funciones se dice que estn sobrecargadas. Sobrecarga de funciones miembro (en el mbito de la clase)
class Coordenada { public: ... Coordenada distancia(Coordenada &op2); Coordenada distancia(float &op2); };
25
C++
SOBRECARGA DE OPERADORES En C++ se pueden sobrecargar los operadores del lenguaje para utilizarlos con cualquier tipo de dato, incluso clases definidas por el usuario. Los operadores son en realidad funciones cuyo nombre est formado por la palabra reservada operator seguida del operador a sobrecargar.
int operator+(int,int); float operator+(float,int);
26
C++
En 2) los mtodos operator= y operator+ deben ser funciones miembro de la clase. El primer operando es un objeto de la clase (el segundo puede no serlo). En 3) los mtodos no son miembros de la clase. Se debe respetar el significado original de los operadores para no confundir al usuario.
27
C++
Se almacena el resultado de la operacin en el propio objeto Se devuelve referencia al objeto (esto permite concatenar operadores)
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Atributos y mtodos de clase Gestin de memoria dinmica Implementacin de relaciones entre objetos Pruebas unitarias
38
Tambin llamados estticos. Se representan subrayados en UML. Los atributos de clase son comunes a todos los objetos de la clase. Slo existe una copia en memoria compartida por todos los objetos. Los mtodos de clase slo pueden acceder directamente a atributos de clase
39
class Fecha { public: static const int semanasPorAo = 52; static const int diasPorSemana = 7; static const int diasPorAnyo = 365; static string getFormato(); static boolean setFormato(string); private: static string cadenaFormato; };
40
// main.cc (Acceso) int main() { Fecha f; cout << Fecha::semanasPorAnyo << << f.diasPorSemana << endl; cout << Fecha::getFormato() << << f.getFormato() << endl; }
41
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Atributos y mtodos de clase Gestin de memoria dinmica Implementacin de relaciones entre objetos Pruebas unitarias
42
C++
delete
delete pDato; pDato=NULL; delete [] pArray; pArray=NULL;
IMPORTANTE: No olvidar los corchetes en delete si los hemos usado en el new correspondiente
43
C++
El array en s mismo Cada uno de los objetos que componen el array Con variables automticas, C++ permite hacer ambas cosas en una sola lnea:
Naipe arrayDeCartas[52]; //invoca a ctor. por defecto de Naipe para cada componente
C++
NDICE
1. 2. 3. 4. 5. 6.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Atributos y mtodos de clase Gestin de memoria dinmica Implementacin de relaciones entre objetos
49
0..10
Asignatura
- amatr
A
1 -b 10
A
-b 0..10
A
-b 0..*
A
-b
B
class A { private: B b; };
B
class A { private: vector<B*> b; };
class A { class A { private: private: static const int MAXB=10; static const int vector<B*> b; MAXB=10; public: vector<B*> b; A() { }; for (int i=0; i<10; i++) b.push_back(new B());} };
52
A
0..10 -b
b.clear();
: b(otroA.b.size()) { // deep copy for (int i=0; i<b.size(); i++) b[i] = new B(*(otroA.b[i])); } 53
A
* -b
b.push_back(new B(unB)); }
54
C++
NDICE
1. 2. 3. 4. 5. 6. 7.
Funciones amigas Entrada / Salida Sobrecarga de funciones y operadores Atributos y mtodos de clase Gestin de memoria dinmica Implementacin de relaciones entre objetos Pruebas unitarias
55
C++
PRUEBAS UNITARIAS
La interfaz de una clase debe ser probada de manera sistemtica. Una prueba unitaria comprueba que un mtodo determinado, ante una llamada determinada, se comporta como se espera.
Se realiza un caso de prueba unitaria para cada funcin no trivial o mtodo de forma que cada caso sea independiente del resto.
56
C++
PRUEBAS UNITARIAS Herramientas de prueba Son unas colecciones de clases con las que se pueden desarrollar casos de prueba fcilmente. Para c++ existen multitud de herramientas: CPPUnit. Boost.Test. CPPUnitLite. NanoCPPUnit. Unit++. CxxTest <-- Usaremos sta
58
C++
59
C++
PRUEBAS UNITARIAS: CXXTEST Instalacin 1. Obtener CXXTEST: http://cxxtest.sourceforge.net 2. Desempaquetar en un subdirectorio test (normalmente en el directorio de trabajo) (para las prcticas de POO, CXXTEST vendr preinstalado en los autocorrectores).
60
C++
C++
Resultado:
Running 2 tests. MyTestSuite.h:15: Expected (2 * 2 == 5), found (4 != 5) Failed 1 of 2 tests Success rate: 50%
62
C++
PRUEBAS UNITARIAS: CXXTEST Especificacin de casos de prueba mediante aserciones TS_ASSERT Es la prueba bsica. Comprueba que una expresin es cierta. void testCalculadora() { TS_ASSERT( suma( 0, 0 ) == 0 ); }
63
C++
TS_ASSERT_EQUALS Verifica la igualdad entre dos expresiones. Equivalente al operador == en TS_ASSERT. void testResta() { TS_ASSERT_EQUALS(resta(4,2),2); }
64
C++
TS_ASSERT_DELTA Se usa para comparar si dos valores son iguales hasta delta. Bsicamente se usa para nmeros en coma flotante. void testSqrt( void ) { TS_ASSERT_DELTA(sqrt(4.0), 2.0, 0.00001); }
65
C++
TS_ASSERT_DIFFERS Es lo contrario a TS_ASSERT_EQUALS. Se usa para comprobar que dos valores son distintos. Es equivalente a usar != en TS_ASSERT. void testNumeros ( void ) { TS_ASSERT_DIFFERS(5,7); }
66
C++
TS_WARN
Muestra una lista de mensajes de cosas por hacer del tipo to do. void testToDoLista( void ) { TS_WARN( "TODO: Escribir todos );
los test!"
67
C++
TS_FAIL Muestra un fallo incondicional. void testFallo() { TS_FAIL( "No se puede testear." ); }
68
C++
class PuntoTestSuite : public CxxTest::TestSuite { Punto* c00; Punto* c11; public: void setUp() { // Cdigo que se ejecuta antes de cada prueba c00 = new Punto; c11 = new Punto; c11->setX(1.0); c11->setY(1.0); } void tearDown() { // Cdigo que se ejecuta despus de cada prueba delete c00; c00=NULL; delete c11; c11=NULL; } ...
69
C++
70
SEMINARIO C++
Introduccin a la Programacin Orientada a Objetos
FIN parte III