[C con Clase] Otra duda

Salvador Pozo salvador en conclase.net
Jue Mar 13 16:10:55 CET 2014


MAj>  2. Como segunda pregunta teng un pedazo de codigo que no entiendo muy bien
MAj> ya que se utiliza la palabra reservada auto , la busque en el curso de la
MAj> pagina de conclase.net pero la verdad creoq ue la definicon es muy poca
MAj> para lo que se esta haciendo en este codigo , podrias explicarme como
MAj> funciona el uso de esta palabra en el siguiente fragmento de codigo:
MAj>  Enum ColorCsilla{VACIO, CIRCULO,CRUZ};
MAj> typedef < array<array<ColorCasilla , 3> , 3> Celda ;
MAj> class juego{
MAj> public:
MAj> void inisalizar(){
MAj> for (auto& linea :celda){
MAj> for(auto& kase : celda){
MAj> kase = VACIO;
MAj> }
MAj> }
MAj> }
MAj> private:
MAj> Celda celda;
MAj> }
MAj> El tipo enum , lo entiendo bien , paro la parte del typedef es un poco
MAj> confusa ,en que capitulo del curso podria conseguir informacion sobre este
MAj> tipo de usos del typedrf.

Hola:

Quiero aclarar un par de cosas antes de responder.

1) El código que envías tiene algunos errores, supongo que te has equivocado al transcribirlo. El código corregido es este:
----8<------
#include <array>

using namespace std;

enum ColorCasilla{VACIO, CIRCULO,CRUZ};

typedef array<array<ColorCasilla , 3>  , 3> Celda ;

class juego {
  public:
    void inisalizar(){
        for (auto& linea :celda){
            for(auto& kase : linea){
                kase = VACIO;
            }
        }
    }

  private:
    Celda celda;
};
----8<------

2) Este fragmento de código hace uso de algunas nuevas características de C++, que pertenecen al nuevo estándar C++11. Para que la mayoría de los compiladores actuales acepten estas nuevas características (que en muchos casos están en fase experimental), hay que activar alguna opción del compilador.

En mi caso, usando Code::Blocks, hay que activar la opción "-std=c++11" o "-std=gnu++11".

Dicho esto, pasaré a explicar tus dudas.

La palabra reservada typedef se explica en el capítulo 19.

http://c.conclase.net/curso/?cap=019

Básicamente se usa para definir nuevos tipos. En este caso, define un tipo llamado "Celda", que es un array de tres por tres elementos de tipo "ColorCasilla".

En cuanto a la palabra reservada auto, en C++11 tiene usos completamente diferentes. Las explicaciones al respecto en el curso de la página no te serán útiles, ya que no está adaptado al nuevo estándar.

Básicamente, lo que hace auto en estos bucles for es deducir el tipo de iterador a partir de la expresión que aparece después de los dos puntos.

   for (auto& linea :celda)

En este caso, como celda es un array de tres elementos de arrays de tres "ColorCasilla", el tipo de "linea" es un array de tres elementos de tipo "ColorCasilla".

Sería equivalente usar el bucle:

   for (array<ColorCasilla,3>& linea :celda)

En el caso del segundo bucle:

   for(auto& kase : linea)

Como línea es de tipo array<ColorCasilla,4>, el tipo de kase es "ColorCasilla". Sería equivalente usar:

   for(ColorCasilla& kase : linea)

C++11 ha modificado el significado de la palabra clave auto para facilitar la vida de los programadores. No porque se eviten saber el tipo de algunas variables (que lo deben saber), sino porque es más fácil dejar que el compilador, que también lo sabe, nos evite escribir expresiones largas.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net


Más información sobre la lista de distribución Cconclase