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; } |