[C]Es posible tener una funcion en un struct?

Iniciado por huchoko, 26 Febrero 2019, 01:16 AM

0 Miembros y 1 Visitante están viendo este tema.

huchoko

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

K-YreX

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).
Código (cpp) [Seleccionar]

#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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

huchoko

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).
Código (cpp) [Seleccionar]

#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  :)

K-YreX

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
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Loretz

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;
}

CalgaryCorpus

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.

Código (cpp) [Seleccionar]
asd.pfun = &sumar; 
// tambien puede escribirse sin &
asd.pfun = sumar;
Aqui mi perfil en LinkedIn, invitame un cafe aqui