Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/01/2016, 01:25
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Necesito orientacion con el siguiente codigo

Cita:
Iniciado por aguml Ver Mensaje
Para empezar no comprendo lo que haces en la estructura que pones el ¿prototipo de la función posición? Se llama igual que la estructura ¿es como un constructor o algo así como con las clases. Además hay dos puntos y más cosas tras ellos que tampoco entiendo.
Código C++:
Ver original
  1. struct Posicion
  2. {
  3.   size_t fila;
  4.   size_t columna;
  5.  
  6.   Posicion(size_t fila, size_t columna)
  7.     : fila(fila),
  8.       columna(columna)
  9.   { }
  10.  
  11.   bool operator==(const Posicion& otra) const
  12.   {
  13.     return (fila == otra.fila) && (columna == otra.columna);
  14.   }
  15. };

En C++, la única diferencia entre struct y class es que por defecto (es decir, si no se indica algo explícitamente) el acceso a sus miembros es público en struct y privado en class. En todo lo demás son exactamente iguales: aceptan herencia (ya sea de struct o de class), polimorfismo, usan constructores, admiten la sobrecarga de operadores, ...

En el caso que comentas:

Código C++:
Ver original
  1. Posicion(size_t fila, size_t columna)
  2.     : fila(fila),
  3.       columna(columna)
  4. { }

Se refiere a un constructor para objetos de tipo Posicion. Los que ves tras los dos puntos son inicializaciones de variables. Lo anterior es similar (que no necesariamente idéntico) a lo siguiente:

Código C++:
Ver original
  1. Posicion(size_t fila, size_t columna)
  2. {
  3.   this->fila = fila;
  4.   this->columna = columna;
  5. }

La diferencia principal se encuentra en la cantidad de incializaciones que recibe cada variable. En el primer código se llama al constructor copia de la variable, mientras que en el segundo se llama primero al constructor por defecto y después se hace una asignación. Si trabajas con objetos en vez de con tipos primitivos el segundo ejemplo suele ser más costoso.

Un detalle que puede llamar la atención es que en el primer código no hace falta usar this y en el segundo sí. Esto se debe a que el compilador en este caso es un pelín inteligente y sabe que estoy inicializando la clase, luego únicamente me va a dejar inicializar miembros de la clase. Para el compilador es como si hubiésemos escrito algo tal que:

Código C++:
Ver original
  1. Posicion(size_t f, size_t c)
  2.     : fila(f),
  3.       columna(c)
  4. { }

¿Por qué uso un struct aquí? por comodidad. No tengo ninguna necesidad de hacer que sus variables internas sean privadas, creando un struct me ahorro tener que poner public:

Cita:
Iniciado por aguml Ver Mensaje
Otra cosa que me ha llamado la atención es que usas un tipo llamado "auto" ¿ese que tipo es?
Llegados a este punto toca ir revisando las modificaciones que se introdujeron con el estándar C++11. Bien es cierto que el estándar de C++ lleva muuuuchos años parado, pero ahora ha empezado a coger carrerilla. Prueba de ello es que ya tenemos dos estándares nuevos (C++11 y C++14) y otro en camino (C++17).

auto es una palabra reservada que se introdujo en C++11. auto permite declarar variables, la única cosa es que no eliges tu el tipo de la variable, sino que encargas al compilador la tarea de "deducir" el tipo.

Parece algo chorra pero es muy útil. Imagínate un programita completo y te toca cambiar el tipo que devuelve una función. Usando la forma tradicional tendrías que buscar todos los usos de la función y cambiar el tipo de la variable en multitud de sitios... con auto simplemente recompilas y es el compilador el que se encarga de esa tarea.

Cita:
Iniciado por aguml Ver Mensaje
Bueno hay muchas más cosas pero esas me han dejado descolocado.
Pues no te cortes y pregunta, que para eso estamos aquí ;)

Cita:
Iniciado por acknowledge
Una forma muy poco eficiente y bruta seria hacer un algoritmo que al azar vaya adelante izquierda o derecha y memorizar los nodos donde estuvo (para no volver al mismo nodo) e ir sumando hasta que llegue de casualidad al final. y ver si es el resultado deseado y si no cumple volver a iterar hasta que la suma sea el numero deseado.
Tu has escrito una respuesta sin leer lo que ya estaba escrito, verdad?

La solución que he puesto sigue exactamente ese ineficiente camino... pero oye, para haber sacado el programa en media hora no está mal del todo, no? :)

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.