Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

Programación C++ con las Librerías QT sobre entorno linux

CAPITULO VIII

I. CONTENIDO

CAPÍTULO No. 8: POO, Widget QT básicos Duración: 4 Hrs

Temas Habilidades

Al finalizar el capítulo, el alumno podrá:


• Programación Orientada a Objetos • Identifica la funcionalidad de la
programación orientada a objetos.

II. PROGRAMACION ORIENTADA A OBJETOS

Los conceptos de la programación orientada a objetos (POO) tienen origen en Simula 67,
un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen
Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que
trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria
de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea
surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo
responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron
refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya
primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente
dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener
un sistema basado en programas estáticos.

La POO tomó posición como la metodología de programación dominante a mediados de


los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje
de programación C. Su predominancia se consolidó gracias al auge de las interfaces
gráficas de usuario, para los cuales la programación orientada a objetos está
particularmente bien adaptada. En este caso, se habla también de programación orientada
a eventos.

La POO es una forma especial de programar, más cercana a como expresaríamos las cosas
en la vida real que otros tipos de programación. Con la POO tenemos que aprender a
pensar las cosas de una manera distinta, para escribir nuestros programas en términos
de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar

Capitulo VIII Pág. 1


Programación C++ con las Librerías QT sobre entorno linux
conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de
programación.

La POO trata de amoldarse al modo de pensar del hombre y no al de la máquina. Esto es


posible gracias a la forma racional con la que se manejan las abstracciones que
representan las entidades del dominio del problema, y a propiedades como la jerarquía o
el encapsulamiento.

El elemento básico de este paradigma no es la función (elemento básico de la


programación estructurada), sino un ente denominado objeto. Un objeto es la
representación de un concepto para un programa, y contiene toda la información necesaria
para abstraer dicho concepto: los datos que describen su estado y las operaciones que
pueden modificar dicho estado, y determinan las capacidades del objeto.

➢ Objetos, Objeto es el concepto clave de la POO, la idea de objeto es similar a la


del mundo real, un objeto puede ser una silla, una mesa, tu mascota es un objeto.

Los objetos tienen dos características: un estado y un comportamiento. Fijate que


por ejemplo su perro tiene un estado: nombre, color, raza, altura, etc. y un
comportamiento: ladrar, cavar pozo, llorar, dormir, comer, etc.

Un auto es un objeto. También tiene un estado: cantidad de puertas, color,


tamaño, etc. y un comportamiento: acelerar, frenar, subir cambio, bajar cambio,
girar izquierda, girar dererecha, etc.

Entonces podemos definir a un objeto en POO, como un conjunto de datos y


funciones relacionadas. A las funciones de los objetos, tales como acelerar en el
caso del auto, de aquí en más las llamaremos métodos, a los datos los llamaremos
atributos.

Los objetos en programación, son modelados observando objetos del mundo real,
por ejemplo implementamos el objeto "perro" dentro de nuestro programa
definiendo los atributos y métodos del objeto perro real.

Capitulo VIII Pág. 2


Programación C++ con las Librerías QT sobre entorno linux
El objeto "perro" se puede representar gráficamente como la siguiente imagen:

METODO ATRIBUTOS
S

Un ejemplo más real es el objeto cuenta bancaria que tendría como atributos: tipo,
número, titular, saldo, etc.; y métodos: depositar, retirar, etc.

Un objeto por si solo no tiene mucho significado. Ejemplo: el objeto "auto" no tiene
mucho sentido si no interactúa con un objeto "persona" que maneje.

La interacción entre objetos se produce mediante mensajes. Los mensajes son


llamados a métodos de un objeto en particular.

Podemos decir que el objeto persona envía el mensaje "girar a la izquierda" al


objeto auto.

Los mensajes pueden contener parámetros. Por ejemplo teniendo un método en el


objeto auto llamado "Girar" que recibe como parámetro la dirección (derecha o
izquierda).

Un mensaje está compuesto por los siguientes tres elementos:

✓ El objeto destino, hacia el cual el mensaje es enviado


✓ El nombre del método a llamar
✓ Los parámetros solicitados por el método

➢ Clases, una clase es algo abstracto que define la "forma" del objeto, se podría
hablar de la clase como el molde de los objetos.

Capitulo VIII Pág. 3


Programación C++ con las Librerías QT sobre entorno linux
En el mundo real existen objetos del mismo tipo, por ejemplo tu bicicleta es solo
una mas de todas las bicicletas del mundo. Entonces diríamos que tu bicicleta es
una instancia de la clase "Bicicleta". Todas las bicicletas tienen los atributos: color,
cantidad de cambios, dueño y métodos: acelerar, frenar, pasar cambio, volver
cambio.

Las fabricas de bicicletas utilizan moldes para producir sus productos en serie, de
la misma forma en POO utilizaremos la clase bicicleta (molde) para producir sus
instancias (objetos).

Los objetos son instancias de clases.

Ejemplo: Podríamos tener la clase Perro, una instancia de esta clase podría ser el
objeto perro llamado "Chicho". La clase Perro especificaría que todos los perros
tendrían un nombre, color de pelo, una altura. Mientras que la instancia "Chicho"
contendrá valores específicos para cada uno de estos atributos.

Podemos definir a una clase como una plantilla que define variables y métodos
comunes para todos los objetos de cierto tipo.

Clase Perro Objetos: perro1, perro2 y perro3

Capitulo VIII Pág. 4


Programación C++ con las Librerías QT sobre entorno linux
➢ Encapsulamiento, como se pudo observar en la Fig.1, los atributos del objeto se
localizan en el centro o núcleo del objeto. Los métodos rodean y esconden el núcleo
del objeto de otros objetos en el programa. Al empaquetamiento de las variables
de un objeto con la protección de sus métodos se le llama encapsulamiento.
Típicamente, el encapsulamiento es utilizado para esconder detalles de la
estructura interna del objeto.

El encapsulamiento de variables y métodos en un componente de software


ordenado es, todavía, una simple idea poderosa que provee dos principales
beneficios a los desarrolladores de software:

✓ Modularidad, esto es, el código fuente de un objeto puede ser escrito, así
como darle mantenimiento, independientemente del código fuente de otros
objetos. Así mismo, un objeto puede ser transferido alrededor del sistema
sin alterar su estado y conducta.

✓ Ocultamiento de la información, es decir, un objeto tiene una "interfaz


publica" que otros objetos pueden utilizar para comunicarse con él. Pero el
objeto puede mantener información y métodos privados que pueden ser
cambiados en cualquier tiempo sin afectar a los otros objetos que dependan
de ello.

Los objetos proveen el beneficio de la modularidad y el ocultamiento de la


información. Las clases proveen el beneficio de la reutilización. Los programadores
de software utilizan la misma clase, y por lo tanto el mismo código, una y otra vez
para crear muchos objetos.

➢ Herencia, la herencia es un mecanismo que permite la definición de una clase a


partir de la definición de otra ya existente. La herencia permite compartir
automáticamente métodos y datos entre clases, subclases y objetos.

La herencia está fuertemente ligada a la reutilización del código en la POO. Esto


es, el código de cualquiera de las clases puede ser utilizado sin más que crear una
clase derivada de ella, o bien una subclase.

Hay dos tipos de herencia: Herencia Simple y Herencia Múltiple. La primera indica
que se pueden definir nuevas clases solamente a partir de una clase inicial mientras

Capitulo VIII Pág. 5


Programación C++ con las Librerías QT sobre entorno linux
que la segunda indica que se pueden definir nuevas clases a partir de dos o más
clases iniciales.

Por ejemplo ovejero alemán y caniche son diferentes razas de perros. En la


terminología orientada a objetos "Ovejero Alemán" y "Caniche" son subclases de
la clase perro. De forma similar Perro es la superclase de "Ovejero Alemán".

Entonces tenemos la siguiente jerarquía de clases:

En UML se representa la relación de herencia mediante una flecha.


Cada subclase hereda los atributos de la superclase. Tanto la clase "Ovejero
Alemán" como "Caniche" tendrán los atributos nombre, color de pelo, altura
definidos en la clase Perro.

Una subclase no esta limitada únicamente a los atributos de su superclase, también


puede tener atributos propios, o redefinir algunos definidos anteriormente en la
superclase.

No se esta limitado tampoco a un solo nivel de herencia, se pueden tener todos los
que se consideren necesarios.

Ejemplo: Clase Empleado hereda de clase Persona, y esta a su vez hereda de clase
Animal.

Las subclases proveen un comportamiento especializado sobre los elementos


comunes provistos por las superclases. Gracias a la herencia, los programadores
pueden rehusar código una y otra vez.

Capitulo VIII Pág. 6


Programación C++ con las Librerías QT sobre entorno linux
➢ Polimorfismo, Polimorfismo quiere decir "un objeto y muchas formas". Esta
propiedad permite que un objeto presente diferentes comportamientos en función
del contexto en que se encuentre. Por ejemplo un método puede presentar
diferentes implementaciones en función de los argumentos que recibe, recibir
diferentes números de parámetros para realizar una misma operación, y realizar
diferentes acciones dependiendo del nivel de abstracción en que sea llamado.

Uno de los objetivos principales de la POO es utilizar una y otra vez el mismo
código. Sin embargo, algunas de las operaciones requieren adaptación para
resolver necesidades particulares. Esta necesidad, se da generalmente entre
superclases y subclases, donde una subclase es una especialización de su
superclase, y puede requerir alcanzar los mismos objetivos, pero con distintos
mecanismos. Por ejemplo, una superclase Rectángulo podría tener una operación
calculoArea() cuyo objetivo es calcular el área del rectángulo, definida como la
multiplicación de los las longitudes de dos lados contiguos. A su vez, la clase
Cuadrado es una subclase de Rectángulo que también tiene una operación
calculoArea() cuyo objetivo es calcular el área del cuadrado, pero que está definida
especialmente para los objetos del tipo cuadrado como la multiplicación de la
longitud de uno de sus lados por si mismo. Este fenómeno, polimorfismo, se aplica
a una operación que adopta varias formas de implantación según el tipo de objeto,
pero cumple siempre el mismo objetivo.

Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una
operación sin conocer el método que debe ser llamado. Estos detalles de la
implantación quedan ocultos para el usuario y la responsabilidad descansa en el
mecanismo de selección de la implantación. Por ejemplo, al tratar de frenar un
vehículo siempre se debe oprimir el pedal del lado izquierdo y así el vehículo se
detendrá sin importar si los frenos son de tambor o de aire

Polimorfismo significa múltiples formas; en POO esto significa que una operación
puede tener más de un método que la implementa. La propiedad de polimorfismo
permite que cuando se envía un mensaje a un objeto, sólo se decida en tiempo de
ejecución que método se invoca. Este concepto se conoce como encadenamiento
tardío. En lenguajes tradicionales estructurados se hace el encadenamiento
temprano, lo que significa que el encadenador sabe resolver todos los llamados a
rutinas en tiempo de compilación/encadenamiento.

Capitulo VIII Pág. 7


Programación C++ con las Librerías QT sobre entorno linux
El polimorfismo es una de las características más poderosas de los lenguajes
orientados a objetos y es especialmente útil en la implementación de clases
contenedoras (listas, vectores, matrices, colas, etc.). Piense, por ejemplo, que una
aplicación para un banco, tiene en una lista todas las cuentas (corrientes y de
ahorros) y que mensualmente hay que calcular los intereses de cada cuenta. Para
calcularlos, basta recorrer la lista e invocar para cada cuenta la operación
calcularInteres(). Cada objeto sabe, en tiempo de ejecución, cuál es el método
indicado que debe aplicar.

Declaración de clases

Para declarar una clase, todo lo que se necesita es escribir una definición de estructura
y sustituir la palabra reservada struct por class. Por ejemplo, una clase empleado con
campos como el nombre, el departamento, la posición, el una función que nos imprima
la información de este quedaría así:

class Empleado {
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
void Imprimir( Empleado infoEmpleado);
}

Cuando usted declara una clase en C++, no se reserva memoria para la clase hasta
que usted crea un objeto de la clase. Crear un objeto de una clase se llama instanciar
un objeto. Un objeto creado de una clase se denomina instancia de una clase. Por
ejemplo, yo puedo tener una instancia de empleado con el valor en m_nombre=Jose,
m_departamento=Sistemas, m_posicion=programador y m_salario=3000 por
ejemplo.

Especificadores de acceso

C++ utiliza especificadores de acceso para permitir controlar a una clase el acceso a
las variables de datos de esa clase. Los especificadores de acceso permiten acceder a
algunos miembros de la clase y restringir el acceso a otros.

Capitulo VIII Pág. 8


Programación C++ con las Librerías QT sobre entorno linux
Hay tres especificadores de acceso en C++: public, private y protected. Cuando usted
declara público (public) un miembro de una clase, usted permite el acceso a tal
miembro desde dentro y fuera de la clase. Los miembros de datos que son declarados
protegidos (protected) son únicamente accesibles por funciones miembro de la clase,
pero no se pueden acceder a ellos desde otras clases. Cuando un miembro de una
clase es declarado privado (private) es ináccesible no sólo desde otras clases y otras
partes del programa, sino también desde sus clases derivadas.

Miremos el siguiente programa de ejemplo. Se compone de tres partes: la primera una


declaración de una clase llamada Empleado:

class Empleado {
private:
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;

public:
void ImprimirInfo();
void SetNombre( char* nombre ) { m_nombre = nombre }
void SetDepartamento( char * departamento) { m_departamento =
departamento }
void SetPosicion ( char* posicion ) { m_posicion = posicion }
void SetSalario ( long salario ) { m_salario = salario }
const char* GetNombre( ){ return m_nombre }
const char* GetDepartamento( ){ return m_departamento }
const char* GetPosicion( ){ return m_posicion }
const char* GetSalario( ){ return m_salario }
};

Las funciones SetNombre, SetDepartamento, setPosicion, setSalario, GetNombre,


GetDepartamento, GetPosicion y GetSalario se denominan funciones intercaladas, que
son funciones que se declaran en una sola línea.

Capitulo VIII Pág. 9


Programación C++ con las Librerías QT sobre entorno linux
Las variables de miembro son declaradas privadas para que funciones de miembro de
otras funciones no tengan acceso a ellas sino a travez de la correspondiente funcion
Get o Set. Las funciones de miembro si son declaradas públicas de tal modo que se
pueda acceder a ellas desde otras funciones.

La definición de la función PrintInfo puede quedar así:

void Empleado::ImprimirInfo( )
{
cout << "Nombre: " << m_nombre << '\n';
cout << "Departamento: " << m_departamento << '\n';
cout << "Puesto: " << m_posicion << '\n';
cout << "Salario: " << m_salario << '\n';
}

Los dos dos puntos ( :: ) se denomina operador de resolución de ambito. Nos indica
que la función que estamos definiendo que en este caso es ImprimirInfo, pertenece a
la clase Empleado.

La tercera parte es la función main. Veamos como podría ser:

void main()
{
//creacion de un objeto de la clase Empleado
Empleado empleado12;

//asignacion de valores a las variables miembro


empleado12.SetNombre("Jose");
empleado12.SetDepartamento("Sistemas");
empleado12.SetPosicion("Programador");
empleado12.SetSalario(3000000);

//impresion de los datos


empleado12.ImprimirInfo();
}

Entonces, primero en:

Capitulo VIII Pág. 10


Programación C++ con las Librerías QT sobre entorno linux

Empleado empleado12;

Se instancia un objeto de la clase Empleado con nombre empleado12. Entonces


empleado12 tiene la estructura de la clase Empleado.

Luego, en las líneas siguientes a la instanciación del objeto, se le asignan los valores
iniciales a sus variables:
//asignacion de valores a las variables miembro
empleado12.SetNombre("Jose");
empleado12.SetDepartamento("Sistemas");
empleado12.SetPosicion("Programador");
empleado12.SetSalario(3000000);

Finalmente se llama ImprimirInfo para imprimir el contenido de las variables, que lo


que hará es imprimir el valor de las varibles en la pantalla:

//impresion de los datos


empleado12.ImprimirInfo();
Permitir el acceso a las variables solo a travez de funciones, que en la mayoría de los
casos se llaman SetXxx y GetXxx, se llama encapsulación de datos. Las funciones que
necesitan valores de otra clase, llaman a las funciones que les dan acceso y obtienen
estos datos sin conocimiento de detalles específicos de como se manipulan los datos.

Operador de resolución de ambito

El operador de ambito permíte acceder de otra manera a funciones de miembro y


variables de miembro de una clase. Cuando aparece el operador de resolución de
ámbito entre el nombre de la clase y el nombre de la función en un programa significa
que la función especificada es un miembro de la clase especificada:

Empleado::ImprimirInfo();

El operador de resolución de ambito se suele utilizar para llamar funciones que se


encuentran fuera del ambito de la función de llamada. Entonces, para llamar la función
ImprimirInfo() de la clase Empleado se fuera de su ambito se debe utilizar este
operador.

Capitulo VIII Pág. 11


Programación C++ con las Librerías QT sobre entorno linux

La principal diferencia entre este operador y los operadores punto y flecha es que el
operador de resolución de ambito se utiliza para acceder a miembros de clases, y el
operador punto y flecha para acceder a miembros de objetos específicos.

Veamos el siguiente código:

::MessageBox("Prueba del operador de resolucion");

Si el operador de resolución de ambito aparece sin un nombre de clase delante,


significa que la función que esta llamando ( MessageBox ) no es miembro de ninguna
clase.

III. LABORATORIO N° 1

Crear un programa que permita con una clase padre y dos clases hijas.

IV. LABORATORIO N° 2

Crear un programa que permita registrar una estructura de datos de persona en un archivo
binario, ingresando los datos como clases.

Capitulo VIII Pág. 12

También podría gustarte