Ver Mensaje Individual
  #7 (permalink)  
Antiguo 03/04/2016, 16:29
enrieto
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 5
Respuesta: Duda sobre declaración de apuntador

Cita:
Mi duda es que ambos serian prototipos ¿no?
double (*pmag)(struct Vector *);
declara a la vez que define el puntero a función pmag.

double *pmag(struct Vector *);
declara la función pmag que necesita ser definida en algún lado.

Cita:
¿como le asignó una función al primer caso?
se usan dos formas técnicamente equivalentes, pero
que como siempre algunos prefieren una forma y otros la otra.
Por ejemplo, si tenés una función f declarada como:

double f(Vector* v);
se puede asignar:
Código:
pmag = f; // más común
pmag = &f; // lo mismo pero despierta fanatismos
Te paso un ejemplo simple:
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. struct Vector {
  4.     double a;
  5.     double b;
  6. };
  7.  
  8. double sumar(Vector* v)
  9. {
  10.     return v->a + v->b;
  11. }
  12.  
  13. double restar(Vector* v)
  14. {
  15.     return v->a - v->b;
  16. }
  17.  
  18. int main ()
  19. {
  20.     double res;
  21.     Vector v{3, 2};
  22.     double (*pmag)(struct Vector*);
  23.     // o double (*pmag)(Vector*); que es lo mismo sin la palabra "struct"
  24.  
  25.     pmag = nullptr; // asigna a pmag el puntero nulo.
  26.  
  27.     pmag = sumar; // asigna a pmag el puntero a sumar()
  28.     res = pmag(&v); // invoca a sumar() a través del puntero pmag
  29.     std::cout << "suma = " << res << '\n';
  30.  
  31.     pmag = restar; // asigna a pmag el puntero a restar()
  32.     res = pmag(&v); // invoca a restar() a través del puntero pmag
  33.     std::cout << "resta = " << res << '\n';
  34. }

Saludos!

P.D: y por favor, a los aconsejadores compulsivos les voy a pedir que tomen esto como una forma rápida y simple de responder a un par de preguntas, no pretendo hacer una próxima librería para las boost ni espero que nadie vaya a quere ampliar o mantener esto en el futuro, así que por favor no se molesten, cuando necesite un consejo voy a saber pedirlo solito