Clases dentro de Clases Una clase puede ser el atributo de otra clase. Veamos como metemos la clase soldado dentro del tanque, esta seria la cabecera:
/**
* Tanque.hpp
* Clase que define el objeto Tanque . El objeto tanque estara lleno
* de Objeto soldados, lo que nos sirve para demostrar el uso de clases
* como atributos, etc..
*
* Pello Xabier Altadill Izura
*
*/
using namespace std;
#include <iostream>
#include "Soldado.hpp"
class Tanque {
public:
// constructores
Tanque();
Tanque(char *nombre, int proyectiles,Soldado soldado);
// destructor
~Tanque();
// copia
Tanque(Tanque const &);
// get/set
char *getNombre () const { return this->nombre; }
void setNombre (char *nombre) { this->nombre = nombre; }
int getProyectiles () const { return this->proyectiles; }
void setProyectiles (int proyectiles) { this->proyectiles = proyectiles; }
Soldado getSoldado () const { return this->soldado; }
void setSoldado (Soldado soldado) { this->soldado = soldado; }
void avanzar(int metros) const;
void disparar();
private:
char *nombre;
int proyectiles;
Soldado soldado;
}; |
/**
* Tanque.cpp
* Programa que implementa la clase Tanque
*
* Pello Xabier Altadill Izura
* Compilacion: g++ Tanque.cpp -o Tanque
*/
#include "Tanque.hpp"
// Constructor
Tanque::Tanque(): nombre("Supertanque"),
proyectiles(10), soldado(Soldado()) {
cout << "-clase Tanque- Tanque " << nombre << " construido. Proyectiles: " << proyectiles << endl;
}
// Constructor parametrizado
Tanque::Tanque(char *nombre, int proyectiles, Soldado soldado) {
this->nombre = nombre;
this->proyectiles = proyectiles;
this->soldado = soldado;
cout << "-clase Tanque- " << nombre << " :Tanque construido. Proyectiles: " << proyectiles << endl;
}
// Destructor
Tanque::~Tanque() {
cout << "-clase Tanque- Tanque "<< this->getNombre() << " destruido."<< endl;
}
// constructor copia
Tanque::Tanque(const Tanque & original) {
nombre = new char;
nombre = original.getNombre();
cout << "-clase Tanque- Tanque copia creada."<< endl;
}
// metodo avanzar
void Tanque::avanzar(int metros) const {
cout << "-clase Tanque-" << this->getNombre() << " avanzando: " << metros << " m." << endl;
}
// metodo disparar
void Tanque::disparar(){
if (proyectiles > 0) {
proyectiles--;
cout << "-clase Tanque-" << this->getNombre() << "BOOOOM!!" << endl;
} else {
cout << "-clase Tanque-" << this->getNombre() << " No queda municion." << endl;
}
}
// funcion principal
// Aqui haremos multiples pruebas...
int main () {
int i, resp;
// creamos los Tanques
Tanque tanqueta = Tanque();
// podemos sacar lso datos del soldado asi:
cout << "El nombre del soldado es: " << (tanqueta.getSoldado()).getNombre()<< endl;
tanqueta.avanzar(5);
tanqueta.disparar();
tanqueta.getSoldado().matar();
return 0;
} |
/**
* Pluma.hpp
* Clase que define el objeto pluma, un objeto que sirve para escribir
*
* Pello Xabier Altadill Izura
*
*/
using namespace std;
#include <iostream>
class Pluma {
public:
Pluma();
Pluma(char *tipo, char *usuario);
~Pluma();
Pluma(Pluma const &);
// ATENCION!!! definimos la clase ESPADA como friend
// por tanto desde ella se podra acceder a los elementos PRIVADOS de la Pluma
friend class Espada;
char *getTipo() const { return this->tipo;}
char *getUsuario() const { return this->usuario;}
private:
// metodo para escribir con la pluma
void escribe (char *texto) {cout << "escribo con la pluma: " << texto << endl;}
void test() { cout << "Mega funcion privada de Pluma!" << endl;}
char *tipo;
char *usuario;
}; |
/**
* Pluma.cpp
* Programa que implementa la clase Pluma
*
* Pello Xabier Altadill Izura
* Compilacion: g++ -c Pluma.cpp
*/
#include "Pluma.hpp"
// Constructor
Pluma::Pluma(): tipo("tinta china"), usuario("Bertrand Russel") {
cout << "Pluma construida." << endl;
}
// Constructor
Pluma::Pluma(char *tipo, char *usuario) {
this->tipo = tipo;
this->usuario = usuario;
cout << "Pluma construida de tipo: " << tipo << endl;
}
// Destructor
Pluma::~Pluma() {
cout << "Pluma destruida." << endl;
}
// Constructor copia
Pluma::Pluma(Pluma const & original) {
tipo = new char;
tipo = original.tipo;
} |
/**
* Espada.hpp
* Clase que define el objeto Espada, un objeto que
sirve para matar
*
* Pello Xabier Altadill Izura
*
*/
using namespace std;
#include <iostream>
class Espada {
public:
Espada();
Espada(char *tipo);
~Espada();
Espada(Espada const &);
// desde este metodo accederemos a la
// parte privada de la pluma
void usarPluma (char *texto);
char *getTipo() const { return this->tipo;}
private:
char *tipo;
}; |
/**
* Espada.cpp
* Programa que implementa la clase Espada
*
* Pello Xabier Altadill Izura
*
* Compilacion: g++ -o Espada Pluma.o Espada.cpp
*/
#include "Espada.hpp"
#include "Pluma.cpp"
// Constructor
Espada::Espada(): tipo("katana") {
cout << "Espada construida." << endl;
}
// Constructor
Espada::Espada(char *tipo) {
this->tipo = tipo;
cout << "Espada construida de tipo: " << tipo << endl;
}
// Destructor
Espada::~Espada() {
cout << "Espada destruida." << endl;
}
// Constructor copia
Espada::Espada(Espada const & original) {
tipo = new char;
tipo = original.tipo;
}
// metodo desde el que accedemos a Pluma
void Espada::usarPluma(char *texto) {
// implementamos una pluma y...
Pluma plumilla = Pluma();
// y ahora accedemos a sus miembros privados: atributos ...
cout << "La pluma es tipo: " << plumilla.tipo << endl;
cout << "Y su usuario es: " << plumilla.usuario << endl;
plumilla.escribe(texto);
// e incluso a sus metodos!
plumilla.test();
}
// funcion principal
int main () {
int i;
Espada tizona = Espada("mandoble");
// invocamos un metodo que accedere a la zona privada de la clase
tizona.usarPluma("jaja uso la pluma a mi antojo");
return 0;
} |
/**
* ChicoChica.cpp
* Clase que define el objeto Chico y Chica. Chico tiene una funcion llamada
* esNovio que dentro de chica la declaramos como friend
y le dara acceso a todo
*
* Pello Xabier Altadill Izura
* Compilacion: g++ -o ChicoChica ChicoChica.cpp
*/
using namespace std;
#include <iostream>
class Chico {
public:
// constructor
Chico():nombre("Romeo") {}
// constructor
Chico(char *nombre) { this->nombre = nombre;}
// destructor
~Chico() {}
// constructor copia
Chico(Chico const & origen) {
nombre = new char;
nombre = origen.nombre;
}
// desde este metodo accederemos a la
// parte privada de la clase chica
void esNovio();
char *getNombre() const { return this->nombre;}
private:
char *nombre;
};
class Chica {
public:
// constructor
Chica():
nombre("Julieta"),
edad(23),
coeficienteInteligencia(140),
medidas("95-60-95") {
}
// destructor
~Chica() {}
// constructor copia
Chica(Chica const & origen) {
nombre = new char;
nombre = origen.nombre;
}
// Aqui definimos un metodo friend externo
// que tendra acceso a toda la clase chica
friend void Chico::esNovio();
// otra opcion seria declara Chico como friend:
// friend class Chico;
private:
void pensar() { cout << "estoy pensado..." << endl; }
void entrarHabitacion() { cout << "estoy entrando en la habitacion..." << endl; }
char *nombre;
int edad;
int coeficienteInteligencia;
char *medidas;
};
// implementacion de la funcion del chico esNovio
void Chico::esNovio() {
Chica neska = Chica();
neska.entrarHabitacion();
cout << "Con esta funcion entro en todo! " << endl;
cout << "Dime tu edad real chica: " << neska.edad << endl;
cout << "Y tu coeficiente intelectual: " <<
neska.coeficienteInteligencia << endl;
cout << "joder, me parece que no te gustara el futbol." << endl;
}
// funcion principal, para las pruebas
int main () {
int i;
Chico mutiko = Chico();
// vamos a ver si llamamos a esNovio...
mutiko.esNovio();
return 0;
} |