Junio 23, 2018, 11:48:27 am

Autor Tema: Manual POO en C++ (Necesito Consejos, Modificaciones, etc)  (Leído 4105 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Manual POO en C++ (Necesito Consejos, Modificaciones, etc)
« en: Enero 24, 2018, 07:03:42 pm »
Resulta que escribí un manual de programación orientada a objetos en java y lo pasé a C# y ahora lo pasé a C++.
Pero como hace bastante ví C++ (no encuentro el cuaderno ensima) y me parece el más difícil de los 3, me gustaría que me dijeran que le agregarían, que modificarían, que es lo que está mal, que consejos me darían, etc.
los dejo con el manual versión C++:

Programación orientada a objetos

Cuando escribimos un programa en un lenguaje orientado a objetos, definimos clases, una clase describe las características y comportamientos de objetos similares.

Por ejemplo: la clase Automóvil lista las características comunes a todos los automóviles (atributos y comportamientos).

Atributos: Color, Nro de ruedas, potencia, cambios, etc
Comportamientos: Encender, Apagar, Marcha atrás, acelerar, etc
Así de forma abstracta listamos atributos y comportamientos que todos los autos pueden tener.

Luego los objetos son la forma concreta de esto mismo:

Tenemos el auto de Juan, con 4 puertas, 5 cambios, marca Mercedes Benz, color azul y el de Fernando con 2 puertas, 4 cambios, rojo, descapotable..

Resumiendo:

Una clase es una plantilla que describe a un conjunto de objetos con características y atributos similares.

Un objeto, o instancia de una clase, es la representación concreta y especifica de esta, que reside en la memoria.

Ejemplo:


Automovil.h
Código: (c++) You are not allowed to view links. Register or Login
#include <iostream>
#include <string>
 
using namespace std;
 
class Automovil {
 
        //Atributos:
        string Color, Marca, Patente;
        int Cambios, Puertas;
 
        //Métodos:
        public: void verDatos(){
                std::cout << "Color: " << this->Color << "\n";
                std::cout << "Marca: " << this->Marca << "\n"; 
                std::cout << "Cambios: " << this->Cambios << "\n"; 
                std::cout << "Puertas: " << this->Puertas << "\n"; 
                if(this->Patente != "")
                {
                        std::cout << "Patente: " << this->Patente << "\n"; 
                }
                std::cout << "\n";
        }
 
 
        //Cuando un método de una clase se llama igual que la clase
        //significa que es el constructor de la clase
        //es decir la funcion a la que se llama al crear el objeto
        //Y se determina sus parámetros
        public: Automovil(string color, string marca, int cambios,
            int puertas){
 
            Color = color;
            Marca = marca;
            Cambios = cambios;
            Puertas = puertas;
        }
 
        //El polimorfismo o sobre carga de métodos
        //Es que podamos tener funciones con el mismo nombre
        //Y distitnos parámetros y acciones
        //En este caso tendremos otro constructor
        //que acepte como parámetro también la patente
        public: Automovil(string color, string marca, int cambios,
            int puertas, string patente){
        //Tanto en éste caso como en el anterior constructor
        //No es necesario utilizar this-> aunque algunos lo ven como
        //una buena práctica, y otros ponen el prefijo m_ en los datos
        //miembro para identificarlos. 
            this->Color = color;
            this->Marca = marca;
            this->Cambios = cambios;
            this->Puertas = puertas;
            this->Patente = patente;
        }
       
 
        //En C++ debemos crear el destructor de la clase
        //Para eso se usa ~NombreDeLaClase
 
        public: ~Automovil(){
                cout << "objeto destruido \n";
         }
       
 }; //Al contrario de C# y java la definicion de las clases
    //terminan con ;

Main.cpp
Código: (c++) You are not allowed to view links. Register or Login
#include "automovil.h"
 
 
int main(){
       
    //Creamos un objeto del tipo automovil
    //Le pasamos parámetros a su constructor
    Automovil* auto1 = new Automovil("Azul", "Mercedez Benz", 5, 4);
    //En este caso también le pasamos la patente
    //Y automáticamente usa el otro constructor
    Automovil* auto2 = new Automovil("Rojo", "Ferrari", 4, 2, "HYO345");       
 
    auto1->verDatos();
    auto2->verDatos();
 
    //Destruimos los objetos (en C++ no hay garbage collection
    //Como en C# o Java)
    delete auto1;
    delete auto2;     
 
   return 1;
}
 
/*
Print:
 
Color: Azul
Marca: Mercedes Benz
Cambios: 5
Puertas: 4
 
Color: Rojo
Marca: Ferrari
Cambios: 4
Puertas: 2
Patente: HYO345
 
objeto destruido
objeto destruido
 
*/
Polimorfismo: Es la capacidad de un método para poder comportarse de diversas maneras y recibir distintos parámetros. Arriba puede verse un ejemplo.
También es conocido como polimorfismo el hecho de que un método que acepta un tipo de objeto como parámetro, acepte a su vez sin necesidad de ningún cambio a los objetos de sus clases hijas.


Herencia:La herencia es una relación entre las clases.
Todas las clases existen dentro de una jerarquía. Cada clase tiene una (o más) clase por encima de ella, ya que en C++ puede haber herencia múltiple (no como en java y C#), denominadas superclases, y cualquier número de clases (o ninguna) por debajo.
A estas últimas se las denomina subclases.
Una clase heredará los métodos y variables miembro de sus superclases. Del mismo modo, sus subclases heredarán los métodos y variables de esas clases.


Ejemplo Herencia:


Persona.h
Código: (c++) You are not allowed to view links. Register or Login
#include <iostream>
#include <string>
 
  //Creamos lo que será la clase padre
    class Persona
    {
        //Protected puede ser accedido desde clases hijas
        protected: int  numeroDeDocumento;
        protected: std::string nombre, apellido, tipoDeDocumento;
 
        //creamos el constructor
        protected: Persona(std::string nom, std::string ape)
        {
            this->nombre = nom;
            this->apellido = ape;
        }
 
        public: void setDocumento(std::string tipo, int numero){
            this->tipoDeDocumento = tipo;
            this->numeroDeDocumento = numero;
        }
 
        public: void verDocumento(){
            std::cout << "\nTipo de documento: " << tipoDeDocumento <<
                    "\nNúmero de documento: " << numeroDeDocumento;
        }
 
        public: void verNombre(){
            std::cout << "\nNombre: " << nombre
                << "\nApellido: " << apellido;
        }
 
 };


Programador.h
Código: (c++) You are not allowed to view links. Register or Login
#include <iostream>
 
//Esta será otra clase padre de empleado
//No tiene mucho sentido es solo para el ejemplo
//De herencia múltiple:
 
class Programador{
 
        /*En este caso definieremos la función programar
        Pero en lugar de implementarla en el archivo .h
        La implementaremos en un .cpp
        Esta es la verdadera forma de hacerlo
        Si bien luego seguiremos implementandolos dentro de la clase
        Sepan que para evitar ciertos errores de compilación los métodos
        debemos definirlos en los .h pero implementarlos en .cpps
        */
        public: void programar();
 
        public: Programador(){}
 
 
};

Programador.cpp
Código: (c++) You are not allowed to view links. Register or Login
#include "Programador.h"
//no hace falta incluir iostream por que lo incluimos
//en el archivo de cabezera.h
 
 
/*En este .cpp implementaremos la funcion programar
Que declaramos en Programador.h
Recuerden que esta es la verdadera forma de hacerlo*/
void Programador::programar(){
 
        std::cout << "\nProgramando.. ";
 
}

Empleado.h
Código: (c++) You are not allowed to view links. Register or Login
#include <iostream>
#include <string>
 
 
   //La clase Empleado hereda de Persona y de Programador
   //Debemos decirle si queremos que la herencia sea publica
   //Pueda accederse a las funciones y datos publicos de la clase padre
   //desde otras clases
    class Empleado : public Persona, public Programador {
 
        int Sueldo;
        std::string Cargo;
 
        //El constructor mínimamente debe tener
        //los parámetros del constructor de
        //la clase Padre:
        public: Empleado(std::string nom, std::string ape, int sueldo,
            std::string cargo) : Persona (nom, ape), Programador(){
           
 
            this->Sueldo = sueldo;
            this->Cargo = cargo;
            //Nombre y apellido fueron algunos de los
            //Atributos heredados:
            this->nombre = nom;
            this->apellido = ape;
        }
 
        public: void VerSueldo(){
            std::cout << "\nSueldo: " << Sueldo;
        }
 
        //Destructor
        ~Empleado(){}     
 
       
        //Definimos otro método pero no lo implementamos acá
        //Vamos a implementarlo fuera de la clase solo para
        //Mostrar que se puede hacer así
        public: void verCargo();
     
 
};
 
//Acá implementamos el método que declaramos en la clase
void Empleado::verCargo(){
 
           std::cout << "\nCargo: " << Cargo;
}



main.cpp
Código: (c++) You are not allowed to view links. Register or Login
#include "Persona.h"
#include "Programador.h"
#include "Empleado.h"
 
 
 
int main(){
 
        //Creamos un objeto de la clase empleado
        //Le pasamos los parametros a su constructor
        Empleado* NombreDelObjeto = new Empleado("Juan", "Perez",
                15000, "Software Developer");
        //Como vemos, usamos las funciones de la clase padre
        //Y sus atributos
        NombreDelObjeto->setDocumento("DNI", 20202678);
 
        NombreDelObjeto->verNombre();
        NombreDelObjeto->verDocumento();
        NombreDelObjeto->verCargo();
        NombreDelObjeto->VerSueldo();
 
        NombreDelObjeto->programar();
 
        delete NombreDelObjeto;
 
        return 1;
}
 
/*
        Print:
 
                Nombre: Juan
                Apellido: Perez
                Tipo de documento: DNI
                Número de documento: 20202678
                Cargo: Software Developer
                Sueldo: 15000
                Programando...
 
 
*/

Cómo en este caso tenemos 2 archivos .cpp en lugar de uno en el proyecto, para compilar debemos compilar ambos:

g++ -o main Programador.cpp main.cpp (linux).



Encapsulación: La encapsulación es una técnica para empaquetar la información, envolviendo los atributos y métodos de los objetos en clases, de tal forma que se oculte lo que debe ocultarse y haga visible lo que está pensado para serlo. Tanto los métodos como los atributos pueden ser encapsulados. Para ello se utilizan las palabras: public; protected y private.
Ejemplo

Persona.h
Código: (c++) You are not allowed to view links. Register or Login
#include <string>
#include <iostream>
 
using namespace std;
 
class Persona {
 
        private: int numDoc;
        public: string ColorDePiel;
        public: string nombre;
 
        public: Persona(int doc, string color, string nomb){
            this->numDoc = doc;
            this->ColorDePiel = color;
            this->nombre = nomb;
        }
        //Como numDoc no puede accederse desde otro lado
        //Más que su propia clase, ya que es private
        //Hacemos una función que lo muestre
        public: void VerDoc()
        {
            cout << "\nDocumento: " << this->numDoc;
        }
 
        ~Persona(){}
};
 

main.cpp
Código: (c++) You are not allowed to view links. Register or Login
#include "Persona.h"
#include <iostream>
 
int main(){
 
        Persona* Jorge = new Persona(32145672,"Blanco", "Jorge");
        //Podemos acceder a sus atributos públicos
        //pero no a los private (Solo pueden accederse
        //Desde su misma clase)
        cout << "Color: " << Jorge->ColorDePiel;
        cout << "\nColor: " << Jorge->nombre;
        //No podemos acceder a Jorge->numDoc ya que es private
        //asi que Llamamos a la función publica que muestra
        //el dato private
        Jorge->VerDoc();
 
        delete Jorge;
 
        return 1;
}
 
/* Print:
 
        Color: Blanco
        Color: Jorge
        Documento: 32145672
 
*/



----ACÁ EN EL MANUAL DE C# Y JAVA SIGUE LA INFO DE INTERFACES ---

Gracias por leer.
Por último quería decir que los códigos en cph se estan viendo muy feos que sería bueno que pongan un geshi por que está feo así.

Saludos,
« Última modificación: Enero 30, 2018, 05:32:22 pm por Solid Water »

Not for the money, not for the fame. Not for the power, just no more games.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Manual POO en C++ (Necesito Consejos, Modificaciones, etc)
« Respuesta #1 en: Enero 30, 2018, 05:33:38 pm »
Ahí agregué una info que me facilitó jep.
Si bien es para todo el manual, la agregué en la parte de herencia.

Saludos,
« Última modificación: Enero 30, 2018, 05:36:33 pm por Solid Water »


exclamation
Necesito consejos para comprar una PC

Iniciado por sorjanio

2 Respuestas
1385 Vistas
Último mensaje Abril 21, 2009, 10:44:03 am
por rgb90
xx
necesito consejos sobre xss y sql injection en wordpress

Iniciado por galletita44

5 Respuestas
1284 Vistas
Último mensaje Octubre 20, 2013, 02:02:09 pm
por seth
exclamation
necesito consejos para comprar tarjeta-video

Iniciado por lkis

1 Respuestas
1960 Vistas
Último mensaje Marzo 13, 2009, 09:40:02 am
por rgb90
xx
modificaciones

Iniciado por flony

9 Respuestas
1553 Vistas
Último mensaje Marzo 19, 2010, 01:59:42 pm
por wanm28
question
¿Se han estado haciendo modificaciones en la base de datos?

Iniciado por invi

7 Respuestas
2056 Vistas
Último mensaje Junio 19, 2010, 12:48:48 pm
por iTZBANANO
xx
Descargas utiles para modificaciones en celulares

Iniciado por ..::Lëssiëm Táralóm::..

0 Respuestas
1902 Vistas
Último mensaje Junio 17, 2007, 09:48:50 pm
por ..::Lëssiëm Táralóm::..
xx
Modificaciones y su impacto sobre su visibilidad en buscadores

Iniciado por shevchenko

0 Respuestas
1110 Vistas
Último mensaje Junio 05, 2008, 11:31:27 am
por shevchenko
exclamation
Ayuda Necesito Manual de Asp.net

Iniciado por LinuxSA

1 Respuestas
3637 Vistas
Último mensaje Abril 28, 2007, 11:28:39 pm
por snyx88
xx
Necesito manual Linux.

Iniciado por antoxic

2 Respuestas
1090 Vistas
Último mensaje Mayo 11, 2007, 02:25:14 pm
por Assembler_C
resuelto
Necesito manual de nircmd

Iniciado por The_Boogeyman

2 Respuestas
2300 Vistas
Último mensaje Julio 22, 2009, 12:28:36 pm
por The_Boogeyman