Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda sintaxis C++

Estas en el tema de Duda sintaxis C++ en el foro de C/C++ en Foros del Web. Hola buenas, soy nuevo por aqui un saludo a todos. Tengo una duda sobre la implementacion de un constructor que me he encontrado en un ...
  #1 (permalink)  
Antiguo 06/08/2014, 01:53
 
Fecha de Ingreso: julio-2014
Mensajes: 2
Antigüedad: 9 años, 9 meses
Puntos: 0
Duda sintaxis C++

Hola buenas, soy nuevo por aqui un saludo a todos.

Tengo una duda sobre la implementacion de un constructor que me he encontrado en un codigo que estoy analizando, obviamente el codigo no lo hice yo, pero debo intentar comprenderlo lo mejor posible.

La declaración es normal, en un .h esta la clase y este es uno de los constructores

_InputArray(const Mat& m);

en un .cpp encontre su implementación y no se lo que significan los dos puntos aqui.

_InputArray::_InputArray(const Mat& m) : flags(MAT), obj((void*)&m) {}

Mi intención es solo saber para que se usan esos dos puntos, ya que nunca me lo habia encontrado de esta forma.

Gracias
  #2 (permalink)  
Antiguo 06/08/2014, 02:14
 
Fecha de Ingreso: julio-2014
Mensajes: 2
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Duda sintaxis C++

Segun he encontrado, es una forma de definir argumentos.
  #3 (permalink)  
Antiguo 06/08/2014, 04:33
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Duda sintaxis C++

Hola ErYcK.

¿Podrías dar una referencia donde lo explique?

Gracias

Edit: Vale, tengo muy olvidado C++ pero ahora me he acordado. Y es una manera de inicializar atributos del objeto antes de ejecutar el cuerpo del contructor, es decir, lo que va entre llaves: { ... }. No recuerdo por qué. Pero muchas veces era útil hacerlo así y no asignar los valores dentro del cuerpo del constructor. A eso se le llama lista de inicializadores, si quieres encontrar alguna referencia.

¡Y ahora leyendo esto recuerdo más! Este tipo de inicializadores es necesario ya que en C++ los objetos son como estructuras y no referencias a estructuras. Si una clase A tiene un atributo que es un objeto de otra clase B, si no creas el objeto de clase B mediante la lista de inicializadores, llamará por defecto al constructor vacío (sin parámetros) de B y si B no tiene constructor vacío el compilador lanzará un error.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 06/08/2014 a las 04:58
  #4 (permalink)  
Antiguo 06/08/2014, 10:45
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Duda sintaxis C++

_InputArray::_InputArray(const Mat& m) : flags(MAT), obj((void*)&m) {}

Lo de arriba quiere decir que a las variables flags y obj le pasas MAT y (void*)&m respectivamente.

Efectivamente es una forma de asignar valores a las variables miembro que pertenece a la misma clase. flags(MAT) es equivalente a flags = MAT; pero esta ultima iría dentro de las {}.

Edit ah y una cosa mas XD.
Solo se usa en los constructores o eso creo

  #5 (permalink)  
Antiguo 06/08/2014, 11:20
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Duda sintaxis C++

Cita:
Iniciado por vangodp Ver Mensaje
Efectivamente es una forma de asignar valores a las variables miembro que pertenece a la misma clase. flags(MAT) es equivalente a flags = MAT; pero esta ultima iría dentro de las {}.
Conceptualmente es equivalente a lo que en otros lenguajes es asignar el objeto en el cuerpo del contructor. Pero, en C++, con lista de incializadores no te dará problemas con atributos que son objetos de otras clases mientras que de la manera común sí (Mírese la clase A con atributo de la clase B):

Código C++:
Ver original
  1. class B {
  2.    private:
  3.       int num;
  4.    public:
  5.       //declaración del constructor B
  6.       B(int);
  7. };
  8.  
  9. // definición del constructor B
  10. B::B(int n) {
  11.    num = n;
  12. }
  13.  
  14. class A {
  15.    private:
  16.       B b;
  17.    public:
  18.    // declaración del constructor de A
  19.    A(int);
  20. };
  21.  
  22. // definición del constructor A
  23. A::A(int n) {
  24.    b = B(n);
  25. }
  26.  
  27. int main() {
  28.    return 0;
  29. }
No es tan equivalente cuando lo anterio te da el siguiente error:
Código BASH:
Ver original
  1. prova.cpp: In constructor ‘A::A(int)’:
  2. prova.cpp:23:11: error: no matching function for call to ‘B::B()’
  3. prova.cpp:23:11: note: candidates are:
  4. prova.cpp:10:1: note: B::B(int)
  5. prova.cpp:10:1: note:   candidate expects 1 argument, 0 provided
  6. prova.cpp:1:7: note: B::B(const B&)
  7. prova.cpp:1:7: note:   candidate expects 1 argument, 0 provided

Mientras que este código con lista de inicializadores no.
Código C++:
Ver original
  1. class B {
  2.    private:
  3.       int num;
  4.    public:
  5.       //declaración del constructor B
  6.       B(int);
  7. };
  8.  
  9. // definición del constructor B
  10. B::B(int n) : num(n) {}
  11.  
  12. class A {
  13.    private:
  14.       B b;
  15.    public:
  16.    // declaración del constructor de A
  17.    A(int);
  18. };
  19.  
  20. // definición del constructor A
  21. A::A(int n) : b(B(n)) {}
  22.  
  23. int main() {
  24.    return 0;
  25. }

Este concepto de lista de inicializadores al principio puede sonar extraño si vienes de otro tipo de lenguajes orientados a objetos. La diferencia con C++ es que la mayoría de lenguajes orientados a objetos usan memoria dinámica para reservar espacio para los objetos mientras que C++ usa la pila. De ahí, aparece la necesidad de este concepto.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #6 (permalink)  
Antiguo 06/08/2014, 15:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Duda sintaxis C++

Pues muy buen consejo =)
Que fiera Pantaláimon
Suerte!

Etiquetas: int, sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:06.