Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09/02/2016, 08:32
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Incrementar un iterador de un vector<MyClass>

Cita:
Iniciado por dmorill Ver Mensaje
Los explicit no los entendí del todo, en el ejemplo que me diste (modifiqué los espacios a los que yo estoy más acostumbrado jeje) en las dos estructuras definiste un constructor idéntico salvo por el explicit (llamando a una función valor(v), que no las has definido pero al tener el nombre de la atributo de la estructura supongo que es una asignación)
Un constructor en C++ tiene la siguiente forma:

Código C++:
Ver original
  1. POO::POO([argumentos])
  2.   : [inicializadores]
  3. {
  4.   [mas_codigo]
  5. }

Lo que tu presupones que es una función es una simple inicialización, estoy asignando a la variable miembro valor el dato que se le ha pasado como parámetro al constructor.

Tratándose de C++11 también podría haberlo declarado así:

Código C++:
Ver original
  1. struct Foo{
  2.   Foo(int v): valor{v} { }
  3.  
  4.   int valor;
  5. };

Así habría quedado aún más claro que no estoy llamando a una función. No lo he hecho porque la gente aún está demasiado verde en cuanto a los nuevos estándares de C++ se refiere (y eso que de C++11 ya han pasado 5 años).

Cita:
Iniciado por dmorill Ver Mensaje
y al usarlo también se hace de forma idéntica, donde está lo diferente? solo es a nivel de compilación?
Exacto, es una de esas palabras clave que hacen que el código tenga que seguir una serie de reglas determinadas para compilar. ¿Por qué usarlo? Porque puede ayudar a detectar errores de código:

Código C++:
Ver original
  1. struct Punto
  2. {
  3.   int x;
  4.   int y;
  5.  
  6.   Punto(int x=0, int y=0)
  7.     : x(x), y(y) // Inicializacion de las variables miembro
  8.   { }
  9. };
  10.  
  11. int main()
  12. {
  13.   Punto p = 1;
  14.  
  15.   std::cout << "(" << p.x << "," << p.y << ")" << std::endl;
  16. }

Este código es, tal cual, compilable y perfectamente funcional. Una estructura para almacenar puntos 2D con un constructor. ¿Crees que es conveniente el uso que se le da en el main? Yo personalmente no porque si me fijo en la línea

Código C++:
Ver original
  1. Punto p = 1;

No tengo ni la más remota idea de qué hace... ¿Es Punto un typedef de int? ¿Si Punto permite almacenar puntos 2D... qué coordenada estoy guardando? ¿Se está llamando a un constructor o a un operador de asignación que hace conversiones de algún tipo?

Desde luego el código no es nada claro. Sin embargo con un explicit:

Código C++:
Ver original
  1. struct Punto
  2. {
  3.   int x;
  4.   int y;
  5.  
  6.   explicit Punto(int x=0, int y=0)
  7.     : x(x), y(y) // Inicializacion de las variables miembro
  8.   { }
  9. };
  10.  
  11. int main()
  12. {
  13.   Punto p = 1; // Esto ya no compila
  14.  
  15.   // Pero esto sí. Aquí ya tenemos que llamar explícitamente al constructor,
  16.   // por lo que aunque hagamos una llamada poco clara al menos nos obliga
  17.   // a ser conscientes de cómo estamos creando el objeto... En este caso un
  18.   // rápido repaso al constructor nos indica que, si no se indica el valor de y,
  19.   // éste por defecto será 0.
  20.   Punto p = Punto(1);
  21.  
  22.   std::cout << "(" << p.x << "," << p.y << ")" << std::endl;
  23. }

Cita:
Iniciado por dmorill Ver Mensaje
Una pregunta aprovechando que estamos hablando de iteradores, cree una función ...

Cómo lo habrías hecho?
Con lo que expones no veo motivo para que esa función exista. Si necesitas iterar sobre un vector no hay necesidad de llamar a una función. Tendrás que poner un caso de uso más concreto que explique la necesidad de usar esa función... y algo de código también sería de agradecer.

En cuanto a tu problema con it++ comentarte que lo mismo deberías echar un vistazo al tema de pre-incrementos y post-incrementos:

Código C++:
Ver original
  1. int i = 0;
  2. int j = i++; // post-incremento i=1, j=0
  3. int k = ++i; // pre-incremento i=2, k=2

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.