domingo, 21 de noviembre de 2010

Primeros pasos en la Programación Orientada a Objetos. Comenzando a escribir Clases en C++

En mi entrada anterior publique una reseña acerca de la Programación Orientada a Objetos y observamos como de las Clases se derivan Objetos, o mejor dicho instancias de las clases.

En esta entrada daremos los primeros pasos a la programación orientada a objetos utilizando el lenguaje C++. Cabe destacar que esta entrada mostraremos ejemplos simples sobre como podemos comenzar a escribir programas usando la metodología de la programación orientada a objetos.

En esencia, una clase en C++ es una estructura , que en ANSI C se conoce como struct con algunas ventajas sencillas pero muy potentes.

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, en nuestro caso vamos a escribir una clase a la que llamaremos “Empleado” con los algunos campos como el nombre, departamento, posición y función para posteriormente nos imprima la información de este.Nos quedaría de la siguiente forma:

class Empleado{

char* m_nombre;
char* m_departamento;
char* m_posición;
long m_salario;
void Imprimir( Empleado infoEmpleado);

}

Un dato curioso es que cuando nosotros declaramos una clase en C++, no se reserva memoria para la clase hasta que nosotros creamos un objeto de la clase. Como comente anteriormente crear un objeto de una clase se le llama instancia de la clase.

Veamos un ejemplo utilizando la estructura anterior: Por ejemplo podemos crear una instancia o un objeto de la clase Empleado con el valor de m_nombre=Guillermo, m_departamento=Sistemas, m_posición=programador y m_salario=3000 por mencionar un ejemplo.

En la programación orientada a objetos con toparemos con lo que comúnmente se conocen como especificadores de acceso, pero ¿Que son los especificadores de acceso?

Los especificadores de acceso permiten acceder a algunos miembros de la clase y restringir el acceso a otros.

C++ utiliza especificadores de acceso para permitir controlar a una clase el acceso a las variables de datos de esa clase

Hay tres especificadores de acceso en C++, los cuales son: public, private y protected

  • Un miembro público significa que el acceso al mismo puede darse dentro del interior de la clase, dentro de una subclase, y desde un objeto instanciado de cualquiera de estas.
  • Un miembro privado significa que el acceso al mismo puede darse solamente dentro del interior de la clase que lo posee. Normalmente, el programador creador de una clase declara a los atributos de la clase como privados y a los métodos como públicos, esto con la idea de que el usuario de la clase no pueda tener acceso a los atributos sino es atreves de los métodos definidos para el caso.
  • Un miembro protegido se comporta de manera parecida a un miembro privado, salvo que estos son accesibles dentro de la clase que lo posee y desde las clases derivadas, pero no desde los objetos instanciados a raíz de dichas clases.

Veamos un ejemplo utilizando la clase anterior:

 

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.
Las variables de miembro son declaradas privadas para que funciones de miembro de otras funciones no tengan acceso a ellas sino a través de la correspondiente función 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_posición << '\n';
   cout << "Salario: " << m_salario << '\n';
}

Los dos dos puntos ( :: ) se denomina operador de resolución de ámbito. 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("Guillermo");
    empleado12.SetDepartamento("Sistemas");
    empleado12.SetPosicion("Programador");
    empleado12.SetSalario(3000);
    //impresión de los datos
    empleado12.ImprimirInfo();
}

Entonces, primero en : 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("Guillermo");
    empleado12.SetDepartamento("Sistemas");
    empleado12.SetPosicion("Programador");
    empleado12.SetSalario(3000);


Finalmente se llama ImprimirInfo para imprimir el contenido de las variables:
        //impresion de los datos
    empleado12.ImprimirInfo();

que lo que hará es imprimir el valor de las variables en la pantalla.
Permitir el acceso a las variables solo a través 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.

Hasta este punto podemos comenzar a definir las clases en nuestros programas, un dato importante es que la forma de comenzar a escribir programas en el paradigma orientado a objetos se basa principalmente en escribir las definiciones de las clases.

Espero sea de su agrado esta entrada =)

Referencias recomendadas:

Como programar en C/C++ y Java-Harvey M. Deitel Editorial PEARSON, 4a Edición.

http://dis.unal.edu.co/~fgonza/courses/2003/poo/c++.htm

http://dis.unal.edu.co/~fgonza/courses/2003/poo/c++.htm

http://www.dcp.com.ar/poo/poop1.htm

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Objetos_y_Clases

3 comentarios:

  1. Excelente entrada.
    Muy buena explicación de los apartados class con ese ejemplo. Yo en realidad no entendía muy bien eso en un principio, pero se que todo esto me servirá, tomando en cuenta que C y C++ son algunos de los lenguajes de programación mas populares hasta ahora (o al menos es creo).
    Gracias por incluir las referencias, les daré una leída a ver que tal.

    ResponderEliminar
  2. Gracias compañero, si la verdad quise redactar esta entrada ya que muchas personas asi como en mi caso, cuando queremos iniciar a programar en el paradigma orientado a objetos, a veces no tenemos ni la mas minima idea de por donde comenzar. En este caso si te fijas para comenzar a usar C++ como un lenguaje orientado a objetos, es necesario tener ya un conocimiento en ANSI C de lo que son estructuras, y no estaria de mas tambien saber utilizar punteros.Como si bien recuerdas, lo que comento la Dra. en clase,es necesario tener un conocimiento sobre punteros, para poder avanzar a un siguiente nivel en la programacion.
    Yo pienso que teniendo unas buenas bases de lo que son estructuras y punteros, la transicion a utilizar un lenguaje orientado a objetos no sera tan dificil ;)

    ResponderEliminar
  3. Bien. Tres puntos extra. Uno de participación a Guillermo.

    ResponderEliminar