Sobrecarga y valores por defecto En un clase se pueden sobrecargar los metodos y los constructores, e incluso se pueden asignar valores por defecto a los parametros (como en php). Veamos el ejemplo del coche un poco mas desarrollado.
/**
* Coche.hpp
* Clase que representa un coche
*
* Pello Xabier Altadill Izura
*
*/
using namespace std;
#include <iostream>
class Coche {
private:
char *marca;
int cilindrada;
int caballos;
enum marcha { Primera, Segunda, Tercera, Cuarta, Quinta, Pto_Muerto};
public:
Coche();
Coche(int cilindrada,int caballos);
Coche(char *marca,int cilindrada,int caballos);
~Coche();
void arranca();
void avanza(int metros = 5); // Con valor por defecto
void cambiaMarcha(marcha mar);
void cambiaMarcha();
void detiene();
void acelera();
char * getMarca ();
int getCilindrada ();
int getCaballos ();
}; |
/**
* Coche.cpp
* Fichero que implementa la clase coche
*
* Pello Xabier Altadill Izura
*
*/
#include "Coche.hpp";
// Constructor por defecto
Coche::Coche() {
cout << "Coche creado." << endl;
}
// Constructor sobrecargado CON VALORES POR DEFECTO
// si no se establece otra cosa se asignan esos valores
Coche::Coche (int cilindrada = 1000, int caballos = 100) {
this->marca = "Cualquiera";
this->cilindrada = cilindrada;
this->caballos = caballos;
}
// Constructor sobrecargado
Coche::Coche (char *marca,int cilindrada,int caballos) {
this->marca = marca;
this->cilindrada = cilindrada;
this->caballos = caballos;
}
// Destructor
Coche::~Coche() {
cout << "Coche destruido." << endl;
}
void Coche::arranca() {}
void Coche::detiene() {}
void Coche::acelera() {}
// Metodo para que el coche avance. Esta definico con un valor
// por defecto (5) por tanto podria invocarse SIN parametro alguno
void Coche::avanza(int metros) {
cout << this->marca << " ha avanzado " << metros << metros << endl;
}
// Metodo para que el coche cambie de marcha
void Coche::cambiaMarcha() {}
// Metodo -sobrecargado- para que el coche cambie de marcha
void Coche::cambiaMarcha(marcha mar) {}
// Muestra la marca
char * Coche::getMarca () {
return this->marca;
}
// Muestra la cilindrada
int Coche::getCilindrada () {
return this->cilindrada;
}
// Muestra los caballos
int Coche::getCaballos (){
return this->caballos;
}
/**
* NOTA IMPORTANTE
* Atencion : al usar esta clase en otra que ya tiene funcion
* main, no se puede tener otra main.
*/
int main () {
int test = 0;
Coche vehiculo = Coche("Skoda", 1050, 250);
cout << "Lo hice, tengo un: "<< vehiculo.getMarca() << endl;
vehiculo.arranca();
vehiculo.cambiaMarcha();
vehiculo.avanza();
// ATENCION!! esto seria una llamada ambigua, ya que existe otro constructor
// que se puede asignar sin parametros pq tiene valores por defecto que es esta:
// Coche::Coche (int cilindrada = 1000, int caballos = 100) y choca con el constructor
// por defecto. Boludos! el compilador nos rompera el ORTO sin compasion
//Coche segundoCoche = Coche();
return 0;
} |
/**
* Perro.hpp
* Clase de cabecera de Perro
*
* Pello Xabier Altadill Izura
*
*/
using namespace std;
#include <iostream>
class Perro {
public:
Perro (int initialAge);
// constructor COPY
Perro (const Perro &);
~Perro();
// metodos YA implementados
int GetAge() { return itsAge;} // automaticamente inline!
void SetAge (int age) { itsAge = age;} // automaticamente inline!
int * GetPeso() { return peso;} // automaticamente inline!
void SetPeso (int * peso) { this->peso = peso;} // automaticamente inline!
char * GetRaza() { return raza;} // automaticamente inline!
void SetRaza (char * raza) { this->raza = raza;} // automaticamente inline!
char * GetColor() { return color;} // automaticamente inline!
void SetColor (char *color) { this->color = color;} // automaticamente inline!
void Ladra() { cout << "Guau Guau arrr...\n";} // automaticamente inline!
private:
int itsAge;
int *peso;
char *raza;
char *color;
}; |
/**
* Perro.cpp
* Clase que implementa la clase Perro con constructor copy
*
* Pello Xabier Altadill Izura
*
* Compilado: g++ Perro.cpp -o Perro
*/
#include "Perro.hpp"
//constructor
Perro::Perro(int initialAge) {
itsAge = initialAge;
cout << "Creado chucho." << endl;
}
//copy-constructor. Atencion
Perro::Perro(const Perro & perroOrigen) {
itsAge = perroOrigen.itsAge;
peso = new int;
raza = new char;
color = new char;
color = perroOrigen.color;
raza = perroOrigen.raza;
peso = perroOrigen.peso;
cout << "Creado chucho con copia" << endl;
}
//destructor
Perro::~Perro() {
cout << " objeto destruido." << endl;
}
/**
* La funcion principal, crea un perro y le hace ladrar
*/
int main()
{
int t = 0;
bool test = false;
Perro Canelo(5);
Canelo.SetRaza("Pastor vasco");
// Creamos a Laika haciendo una copia de canelo
Perro Laika(Canelo);
cout << "Laika es de raza " ;
cout << Laika.GetRaza() << endl;
Laika.SetRaza("Sovietica");
Canelo.Ladra();
cout << "Canelo es un perro cuya edad es: " ;
cout << Canelo.GetAge() << " años\n";
Canelo.Ladra();
Canelo.SetAge(7);
cout << "Ahora Canelo es " ;
cout << Canelo.GetAge() << " años\n";
cout << "Laika es de raza " ;
cout << Laika.GetRaza() << endl;
return 0;
} |
/**
* Contador.hpp
* Clase que muestra la sobrecarga de operadores matematicos
*
* Pello Xabier Altadill Izura
*/
using namespace std;
#include <iostream>
class Contador {
private:
int valor;
public:
Contador();
Contador(int valor);
~Contador();
Contador(const Contador &);
int getContador () const { return valor;} // inline
void setContador (int valor) { this->valor = valor;} // inline
void operator++ (); // operador PREFIJO ++contador
void operator-- (); // operador PREFIJO --contador
void operator++(int); // operador SUFIJO (postfix) contador++
void operator--(int); // operador SUFIJO (postfix) contador--
Contador operator+(const Contador &); // operador +
bool esCero() { return (valor == 0);} // inline
}; |
/**
* Contador.cpp
* fichero que implementa la clase contador
*
* Pello Xabier Altadill Izura
*/
#include "Contador.hpp"
// Constructor
Contador::Contador() {
valor = 0;
cout << "Contador creado!" << endl;
}
// Constructor con valor
Contador::Contador(int valor) {
this->valor = valor;
cout << "Contador creado con valor inicial: " << valor << endl;
}
Contador::~Contador() {
cout << "Contador destruido!" << endl;
}
Contador::Contador(const Contador & original) {
valor = original.valor;
}
// Sobrecarga de operador unario ++ PREFIJO ++operador
void Contador::operator++ () {
cout << "incrementando valor de contador : " << valor << endl;
++valor;
}
// Sobrecarga de operador unario -- PREFIJO --operador
void Contador::operator-- () {
cout << "decrementando valor de contador : " << valor << endl;
--valor;
}
// Sobrecarga de operador unario ++ SUFIJO operador++
void Contador::operator++ (int) {
cout << "incrementando valor de contador : " << valor << endl;
valor++;
}
// Sobrecarga de operador unario -- SUFIJO operador--
void Contador::operator-- (int) {
cout << "decrementando valor de contador : " << valor << endl;
valor--;
}
// operador +
Contador Contador::operator+(const Contador & tmp) {
return Contador(valor + tmp.getContador());
}
int main () {
int i;
// Definimos un contador
Contador contador;
Contador MegaContador(1687);
Contador resultado;
cout << "Valor de contador: " << contador.getContador() << endl;
// Establecemos un valor inicial
contador.setContador(15);
cout << "Valor de contador: " << contador.getContador() << endl;
cout << "Valor de megacontador: " << MegaContador.getContador() << endl;
// y lo usamos como controlador de un while
while (!contador.esCero()) {
--contador;
}
contador.setContador(1000);
cout << "Valor actual de contador: " << contador.getContador() << endl;
cout << "Valor actual de megacontador: " << MegaContador.getContador() << endl;
resultado = contador + MegaContador;
cout << "Valor de resultado de la suma: " << resultado.getContador() << endl;
return 0;
} |