Funciones Amiga (friend)
Tecnología de la Programación
Javier Nieves Acedo
Conectando con la
sobrecarga de operadores …
… no podemos parar de
pensar …
… algo se nos ha olvidado
algo…
… para hacerlo hay que hablar
de amigos …
Funciones Amiga (1)
 A veces necesitamos el acceso a datos
privados de una clase
 Soluciones:
 Métodos que devuelven los datos
 Haciendo los elementos public
 Haciendo que la función sea amiga
Funciones Amiga (2)
 Son funciones no miembro de la clase
 Esta función es la que accederá a los
elementos privados
 Se utiliza la palabra reservada friend
 Se declara el prototipo de la función
dentro de la clase que va a ser amiga
Funciones Amiga (3)
 Ejemplo (1):
class Jugador
{
private:
char nombre[20];
int edad;
int dorsal;
public:
void Init(char[], int, int);
friend void Pr(const &Jugador); // ¡Amiga!
};
Funciones Amiga (4)
 Ejemplo (2):
void main()
{
Jugador j1, j3, j5;
j1.Init(“AAA”, 20, 1);
j2.Init(“BBB”, 20, 3);
j1.Init(“CCC”, 20, 5);
Pr(j1);
Pr(j3);
Pr(j5)
}
Funciones Amiga (5)
 ¿Qué sucedería?
j1.Pr();
Error del Compilador: La función
no es miembro de la clase
Funciones Amiga (y 6)
 Una función amiga puede acceder a
elementos de varias clases.
 Requisitos:
 Definir su prototipo en todas las clases con
la palabra friend
 Recibir como parámetros los objetos de las
clases
Clases Amigas (1)
 Una clase completa también puede ser
amiga
 Todas las funciones miembro de la clase
pueden acceder a las partes privadas de la
otra clase
Clases Amigas (y 2)
 Ejemplo:
class animales;
class hombre
{
......
public:
friend class animales;
};
class animales
{
......
};
… para hacerlo hay que hablar
de amigos …
Sobrecarga del Operador << (1)
 Son operadores globales
 Habitualmente se utilizan las funciones amigas
en la sobrecarga del operador << o >> (Salida
/ Entrada)
 Se exige que la sobrecarga sea de este tipo.
 Utilizando el ejemplo de Jugador…
Sobrecarga del Operador << (2)
 Ejemplo (1):
class Jugador
{
private:
char nombre[20];
int edad;
int dorsal;
public:
. . . . . .
friend ostream & operator<< (ostream &,
const Jugador &);
. . . . . .
};
Sobrecarga del Operador << (3)
 Ejemplo (2):
ostream & operator<< (ostream & os, const
Jugador & j)
{
os << j.nombre << “ edad: ” << j.edad
<< “ dorsal: “ << j.dorsal << endl;
return os;
}
 friend
función
únicamente se pone al declarar la
Sobrecarga del Operador << (4)
 Esta sobrecarga permite que hagamos:
cout << j1 << j3;
 La sobrecarga del operador >> se hace
igual.
 ostream cambia por istream
 El segundo argumento ya no es constante
Sobrecarga del Operador << (5)
 Dentro de la clase:
friend istream& operator>>(istream& in,
Jugador& j);
 Fuera de la clase:
istream& operator>>(istream& in,
Jugador& j){
cout << “Dame la edad”;
in >> j.edad;
return in;
}
Sobrecarga del Operador << (y 6)
 También se pueden usar sin ser friend
 La función va fuera de la clase
 Para acceder a los valores de nuestra clase se hace a través
de métodos
ostream & operator<< (ostream & os, const Jugador
& j)
{
os << j.getNnombre() << “ edad: ” <<
j.getEdad() << “ dorsal: “ << j.getDorsal()
<< endl;
return os;
}
Ejemplo Clase Polinomio (1)
 En este ejemplo representa un polinomio
de segundo grado
ax2 + bx + c
 Sirve como recordatorio de los conceptos
ya explicados
Ejemplo Clase Polinomio (2)
 Polinomio.h (1)
#ifndef __polinomio__
#define __polinomio__
#include <iostream.h>
class Polinomio
{
private:
int a;
int b;
int c;
static int numPolinomios;
Ejemplo Clase Polinomio (3)
 Polinomio.h (2)
public:
Polinomio();
Polinomio(int, int, int);
Polinomio(const Polinomio &);
~Polinomio();
Polinomio
Polinomio
Polinomio
Polinomio
Polinomio
& operator=(const Polinomio & );
operator+(const Polinomio &);
& operator++(const Polinomio &);
& operator!();
& operator*(int);
Ejemplo Clase Polinomio (4)
 Polinomio.h (y 3)
int operator()(int);
friend bool operator==(const Polinomio &,
const Polinomio &);
friend ostream & operator<<(const ostream&,
const Polinomio &);
static int CuantosPolinomios();
};
#endif
Ejemplo Clase Polinomio (5)
 Polinomio.cpp (1)
#include “Polinomio.h”
Polinomio::Polinomio()
{
a = b = c = 0;
numPolinomios++;
}
Polinomio::Polinomio(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
numPolinomios++;
}
Ejemplo Clase Polinomio (6)
 Polinomio.cpp (2)
Polinomio::Polinomio(const Polinomio & p)
{
a = p.a;
b = p.b;
c = p.c;
numPolinomios++;
}
Polinomio::~Polinomio()
{
numPolinomios--;
}
Ejemplo Clase Polinomio (7)
 Polinomio.cpp (3)
Polinomio & Polinomio::operator=(const Polinomio &
p)
{
a = p.a; b = p.b; c = p.c;
return *this;
}
Polinomio Polinomio::operator+(const Polinomio & p)
{
Polinomio suma; suma.a = a + p.a;
suma.b = b + p.b; suma.c = c + p.c;
return suma;
}
Ejemplo Clase Polinomio (8)
 Polinomio.cpp (4)
bool operator==(const Polinomio & p1,
const Polinomio & p2)
{
return (p1.a == p2.a && p1.b == p2.b &&
p1.c == p2.c);
}
Polinomio & Polinomio::operator++()
{
a++; b++; c++;
return *this;
}
Ejemplo Clase Polinomio (9)
 Polinomio.cpp (5)
Polinomio & Polinomio::operator*(int k)
{
a = a*k; b = b*k; c = c*k;
return *this;
}
Polinomio & Polinomio::operator!()
{
a = -a; b = -b; c = -c;
return *this;
}
Ejemplo Clase Polinomio (10)
 Polinomio.cpp (6)
int Polinomio::operator()(int x)
{
return (a*x*x) + (b*x) + c;
}
ostream & operator<< (ostream & os,
const Polinomio & p)
{
os << p.a << "x^2";
...
return os;
}
Ejemplo Clase Polinomio (11)
 Polinomio.cpp (y 7)
int Polinomio::CuantosPolinomios()
{
return numPolinomios;
}
int Polinomio::numPolinomios = 0;
Ejemplo Clase Polinomio (12)
#include “Polinomio.h”
void main()
{
Polinomio p1;
Polinomio p3(2,-3,1);
Polinomio p2 = p3;
Polinomio p4(4,5,-6);
cout << "P1 = " << p1 << "\n";
cout << "P2 = " << p2 << "\n";
cout << "P3 = " << p3 << "\n";
cout << "P4 = " << p4 << "\n\n";
cout << "P1 = P3 + P4 = " << (p1 = p3 + p4)
<< "\n\n";
cout << "++P3 = " << ++p3 << "\n";
Ejemplo Clase Polinomio (y 13)
cout
cout
cout
cout
<< "!P3 = " << !p3 << "\n";
<< "P3*3 = " << (p3 * 3) << "\n\n";
<< "P4(2) = " << p4(2) << "\n\n";
<< "P3 == P4?:" <<
(p3 == p4 ? "Iguales\n" : "Distintos\n");
cout << "\nContador: "
<< Polinomio::CuantosPolinomios();
}
… que “sobrecarga” nos
hemos quitado de encima…
Funciones Amiga (friend)
Tecnología de la Programación
Javier Nieves Acedo
Descargar

Sobrecarga de Funciones y Operadores