Anuncios

Bienvenidos sean a este post, continuando con el post anterior veremos como se pueden utilizar multiples clases para un mismo fin, comencemos con el ejemplo. Para ello vamos a crear nuestra libreria de encabezado:

rect.h
# include <iostream>

using namespace std;

class Punto
{
public:
        void AsignarX(int x) { suX=x; }
        void AsignarY(int y) { suY=y; }
        int ObtenerX() const { return suX; }
        int ObtenerY() const { return suY; }

private:
        int suX;
        int suY;
};

class Rectangulo
{
public:
        Rectangulo (int superior, int izquierdo,
                         int inferior, int derecho);
        ~Rectangulo (){}
        int ObtenerSuperior() const { return suSuperior; }
        int ObtenerIzquierdo() const { return suIzquierdo; }
        int ObtenerInferior() const { return suInferior; }
        int ObtenerDerecho() const { return suDerecho; }
        Punto ObtenerSupIzq() const { return suSupIzq; }
        Punto ObtenerInfIzq() const { return suInfIzq; }
        Punto ObtenerSupDer() const { return suSupDer; }
        Punto ObtenerInfDer() const { return suInfDer; }
        void AsignarSupIzq(Punto Ubicacion) { suSupIzq=Ubicacion; }
        void AsignarInfIzq(Punto Ubicacion) { suInfIzq=Ubicacion; }
        void AsignarSupDer(Punto Ubicacion) { suSupDer=Ubicacion; }
        void AsignarInfDer(Punto Ubicacion) { suInfDer=Ubicacion; }
        void AsignarSuperior(int superior) { suSuperior=superior; }
        void AsignarIzquierdo(int izquierdo){suIzquierdo=izquierdo;}
        void AsignarInferior(int inferior) { suInferior=inferior; }
        void AsignarDerecho(int derecho) { suDerecho=derecho; }
        int ObtenerArea() const;

private:
        Punto suSupIzq;
        Punto suSupDer;
        Punto suInfIzq;
        Punto suInfDer;
        int suSuperior;
        int suIzquierdo;
        int suInferior;
        int suDerecho;
};
Anuncios

Como pueden ver tenemos dos clases, una llamada Punto y otra Rectangulo, en la primer clase tendremos dos variables de tipo int en la seccion privada, donde almacenaran los valores de X (suX) e Y (suY) y en la parte publica tendremos los metodos para obtener y asignarles nuevos valores a estas dos variables, como vimos anteriormente. En nuestra siguiente clase, Rectangulo, tendremos un par de particularidades, la primera es en el sector privado: Al margen de tener cuatro variables enteras tendremos cuatro objetos creados de la clase Punto, nuestra clase anterior, es decir en nuestras variables almacenaremos los valores del rectangulo en si y en los objetos las coordenadas X e Y de cada uno de los puntos que lo forman, en la seccion tendremos el constructor que nos permitira ingresar los cuatro valores para nuestras variables, despues dispondremos de los metodos para poder obtener los datos de los elementos de la parte privada y para asignarles nuevos valores, observen el detalle de que para obtener los valores de los objetos derivados de Punto el metodo debe ser de la misma clase, es decir en lugar de iniciar con un tipo de variable, como veniamos haciendo hasta ahora, debemos iniciarlo por medio de la clase que lo crea, es decir nuestras funciones no solo se pueden iniciar con un tipo de variable sino tambien con clases que hagamos nosotros, o propias del lenguaje, pero de esto hablaremos mas adelante. Siguiente con nuestra parte publica, los metodos para asignar nuevos valores a los objetos observen como lo iniciamos con un void pero la variable que va a recibir es de tipo Punto, nuestra clase, esto es para mantener la compatibilidad a la hora de asignarle los nuevos datos. Con nuestro archivo de encabezado explicado procedamos a ver el codigo de nuestro programa:

clase_ext01.cpp
# include <iostream>
# include "rect.h"

using namespace std;

Rectangulo::Rectangulo(int superior, int izquierdo,
                                 int inferior, int derecho)
{
        suSuperior = superior;
        suIzquierdo = izquierdo;
        suInferior = inferior;
        suDerecho = derecho;
        suSupIzq.AsignarX(izquierdo);
        suSupIzq.AsignarY(superior);
        suSupDer.AsignarX(derecho);
        suSupDer.AsignarY(superior);
        suInfIzq.AsignarX(izquierdo);
        suInfIzq.AsignarY(inferior);
        suInfDer.AsignarX(derecho);
        suInfDer.AsignarY(inferior);
}

int Rectangulo::ObtenerArea() const
{
        int Ancho = suDerecho - suIzquierdo;
        int Altura = suSuperior - suInferior;
        return (Ancho * Altura);
}

int main()
{
        Rectangulo MiRectangulo(100,20,50,80);
        int area = MiRectangulo.ObtenerArea();
        cout << "Area: " << area << "\n";
        cout << "Coordenada X superior Izquierda: ";
        cout << MiRectangulo.ObtenerSupIzq().ObtenerX() << endl;
        return 0;
}
Anuncios

A diferencia del post anterior, al constructor y al metodo ObtenerArea() no lo definimos dentro del archivo de encabezado, por este motivo debimos definirlo en el programa, se podria haber hecho en el archivo pero para mostrar la flexibilidad de C++ para estas tareas decidimos hacerlo aqui, hablemos primero del constructor, a el le enviaremos cuatro datos (superior, izquierdo, inferior, derecho), primero se los asignaremos a las variables propias de la clase, luego por medio de los metodos de asignacion iremos asignando los valores de X e Y para cada uno de los objetos derivados de la clase Punto, con esto lograremos que los objetos tengan un valor almacenado tanto para suX y suY de cada uno de ellos, como podran darse cuenta cada objeto tendra su propio valor y no se superpondra con ninguno de los otros, despues en ObtenerArea() haremos una simple cuenta para devolver el resultado cuando lo utilicemos, hablemos de main(), iniciamos nuestro objeto MiRectangulo derivado de la clase Rectangulo y le enviamos los valores, despues crearemos una variable llamada area donde por medio del objeto y el metodo ObtenerArea() le asignaremos el valor resultante a la variable, nuestra siguiente linea nos imprimira el valor obtenido del calculo del area, y por ultimo le diremos que nos devuelve el valor de la coordenada X superior izquierda, para ello utilizaremos los siguientes metodos:

MiRectangulo.ObtenerSupIzq().ObtenerX()
Anuncios

Como pueden ver primero utilizamos el objeto creado en el programa, luego usaremos el metodo ObtenerSupIzq(), el cual es un objeto derivado de Punto y por ende podremos tener acceso al metodo de esta clase y por medio de este podremos acceder a ObtenerX() el cual nos devolvera el valor de X asignado a ese punto, si lo compilamos y ejecutamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/c++$ ./program/clase_ext01
Area: 3000
Coordenada X superior Izquierda: 20
tinchicus@dbn001vrt:~/programacion/c++$
Anuncios

Esto es gracias a que los objetos creados de una clase siempre tendran acceso a sus metodos y/o variables publicas, no importa si son creadas en otras clases o son invocadas por otros metodos siempre podran tener acceso, aunque en ciertas circunstancias no pero eso lo veremos mas adelante.

Anuncios

En resumen, hemos visto como se pueden tener varias clases, las cuales pueden interactuar entre si, hemos visto como una clase puede ser utilizada como un tipo de variable, de esta forma estan relacionadas entre si, permitiendo el acceso a las partes publicas de las mismas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00