struct Point
{
    int x;
    void(*func)(struct Point*, int);
};

void addToX(struct Point* a, int b) {
    a->x += b;
}

void main() {
    struct Point p1;
    p1.x = 3;
    p1.func = &addToX;

    printf("%d\n", p1.x);

    p1.func(&p1, 2);
    printf("%d\n", p1.x);
}

En el código anterior, tenemos un objeto Point, que contiene x y una función.

Cuando estoy haciendo un Point, necesito inicializar x y el puntero a la función.

¡Esto es bastante malo ya que no quiero inicializar el puntero de función cada vez!

¿Hay alguna manera de definirlo, de modo que cada vez que creo un nuevo Punto apunte automáticamente a addToX?

2
daniel 15 ene. 2018 a las 01:13

3 respuestas

La mejor respuesta

Si desea tener algunos valores predeterminados, debe crear la función de constructor. Algo como esto:

struct Point createPoint(int x) {
    struct Point r = { x, addToX };
    return r;
}

Y luego úsalo así:

struct Point p1 = createPoint(3);

Alternativamente, puede crear el valor predeterminado como una macro:

#define POINT_INITIALIZER(x) { (x), addToX }

Usado como:

struct Point p1 = POINT_INITIALIZER(3);

Recomendaría la función, porque son más seguras, y no veo ninguna ventaja que otorgue la macro.

2
hyde 14 ene. 2018 a las 22:31

Estoy bastante seguro de que las respuestas a su problema se llaman clase y C ++ . ¿Hay alguna razón en particular por la que te quedes con C simple?

EDITAR: Como usted dijo que es para un proyecto uni: no, no puede inicializarlo "automáticamente". La mejor solución que se me ocurre es definir algo como:

struct Point
{
    int x;
    void(*func)(struct Point*, int);
};

void addToX(struct Point*a, int b) {
    a->x +=b;
}

void point_init(struct Point* a) {
    a->func = &addToX;
}

void main() {
    struct Point p1;
    point_init(&p1);
    p1.x = 3;

    printf("%d\n", p1.x);

    p1.func(&p1, 2);
    printf("%d\n", p1.x);
}
1
Nubok 14 ene. 2018 a las 22:55

La forma más fácil de hacerlo es tener una estructura predeterminada que pueda copiar.

const struct​ foo default_foo = {
    .func = myfunc;
};

Más tarde, puede simplemente inicializar una nueva estructura para el valor predeterminado.

struct foo local_foo = default_foo;

Incluso podría tener otras versiones para casos de uso comunes.

1
technosaurus 14 ene. 2018 a las 23:20