Es posible (en C) tener una función dentro de un struct? Algo así más o menos:
struct foo
{
int bar = 3;
int sumar(int x, int y);
};
int sumar(int x, int y)
{
x += y;
}
int main()
{
struct foo asd;
int spam = asd.bar;
asd.sumar(5, 5);
return 0;
}
Escuche que en C++ se podía, pero como lo puedo hacer en C?
La idea seria tener funciones mas organizadas, se podría con POO si estuviera en C++, pero sinceramente me da asco la forma en que se declaran clases en C++ ;-), aparte que solo puedo usar C ahora.
Saludos
Creo que puramente en C no se puede ya que C no está orientado a objetos como podría estarlo C++.
Decirte que lo que sí puedes hacer es crear un <struct> en C++ y entonces si puedes declarar una función miembro del <struct>.
Pero tienes algunos errores como inicializar la variable y luego tu función no tiene sentido, devuelve un <int> y no tiene ningún <return>...
Te dejo el siguiente código que compilado como un fuente de C++ sí funciona (g++ test.cpp -o test).
Si lo tratas como un fuente C, no va a funcionar (gcc test.c -o test).
#include <stdio.h> // #include <cstdio> para C++ mejor
struct foo{
int x;
int sumar(int y){
return x+y;
}
};
int main(){
foo my_foo;
my_foo.x = 3;
printf("%d\n", my_foo.x); // salida: 3
int suma = my_foo.sumar(5);
printf("%d\n", suma); // salida: 8
}
No sé si te sirve :-X
Cita de: YreX-DwX en 26 Febrero 2019, 01:35 AM
Creo que puramente en C no se puede ya que C no está orientado a objetos como podría estarlo C++.
Decirte que lo que sí puedes hacer es crear un <struct> en C++ y entonces si puedes declarar una función miembro del <struct>.
Pero tienes algunos errores como inicializar la variable y luego tu función no tiene sentido, devuelve un <int> y no tiene ningún <return>...
Te dejo el siguiente código que compilado como un fuente de C++ sí funciona (g++ test.cpp -o test).
Si lo tratas como un fuente C, no va a funcionar (gcc test.c -o test).
#include <stdio.h> // #include <cstdio> para C++ mejor
struct foo{
int x;
int sumar(int y){
return x+y;
}
};
int main(){
foo my_foo;
my_foo.x = 3;
printf("%d\n", my_foo.x); // salida: 3
int suma = my_foo.sumar(5);
printf("%d\n", suma); // salida: 8
}
No sé si te sirve :-X
Ah, que pena :-(, pero talvez me sirva cuando este programando en C++
Gracias :)
Siempre puedes usar una función externa :-X:
// declaracion de la struct
int sumar(struct foo my_foo, int y){
return my_foo.x + y;
}
int main(){
struct foo my_foo;
my_foo.x = 2;
int suma = sumar(my_foo, 8); // suma = 10
}
En C (y en C++) una struct puede tener un "puntero a función" como miembro, que no es lo mismo que una "función miembro" por supuesto, pero es la forma que puede usarse en C para asociar comportamiento a una struct.
Va un ejemplo:
#include <stdio.h>
struct foo {
int bar;
int(*pfun)(int, int); // puntero a función que devuelve int y que toma dos ints como parámetros.
};
int sumar(int x, int y)
{
return x + y;
}
int multiplicar(int x, int y)
{
return x * y;
}
int main()
{
struct foo asd;
asd.bar = 3;
asd.pfun = &sumar;
printf("suma = %i\n", asd.pfun(5, 5));
asd.pfun = &multiplicar;
printf("producto = %i\n", asd.pfun(5, 5));
return 0;
}
Para complementar la excelente respuesta de Loretz, los nombres de las funciones funcionan como punteros inicializados y cuyo contenido es la direccion de memoria de esa funcion, por lo que el uso del & es opcional.
asd.pfun = &sumar;
// tambien puede escribirse sin &
asd.pfun = sumar;