Подтвердить что ты не робот

Можно определить функцию внутри структуры C?

Я пытаюсь преобразовать код С++ в C, и у меня возникают проблемы. Можно ли определить внутри структуры функцию?

Вот так:

 typedef struct  {
    double x, y, z;
    struct Point *next;
    struct Point *prev;
    void act() {sth. to do here};
} Point;
4b9b3361

Ответ 1

Нет, вы не можете определить функцию внутри struct в C.

У вас может быть указатель на функцию в struct, хотя наличие указателя на функцию сильно отличается от функции-члена в С++, то есть неявный this указатель на содержащий struct экземпляр.

Продуманный пример (онлайн-демонстрация http://ideone.com/kyHlQ):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct point
{
    int x;
    int y;
    void (*print)(const struct point*);
};

void print_x(const struct point* p)
{
    printf("x=%d\n", p->x);
}

void print_y(const struct point* p)
{
    printf("y=%d\n", p->y);
}

int main(void)
{
    struct point p1 = { 2, 4, print_x };
    struct point p2 = { 7, 1, print_y };

    p1.print(&p1);
    p2.print(&p2);

    return 0;
}

Ответ 2

Однако вы можете иметь указатель на функцию в структуре. но не таким образом

вы можете определить его таким образом

Пример:

 typedef struct cont_func {
    int var1;
    int (*func)(int x, int y);
    void *input;
} cont_func;


int max (int x, int y)
{
     return (x>y)?x:y;
}

int main () {
   struct cont_func T;

   T.func = max;

}

Ответ 4

В C не разрешается определять метод внутри struct. Вы можете определить указатель функции внутри структуры следующим образом:

typedef struct  {
  double x, y, z;
  struct Point *next;
  struct Point *prev;
  void (*act)();
} Point;

Вам нужно будет назначить указатель на определенную функцию всякий раз, когда вы создаете экземпляр struct.

Ответ 5

Идея состоит в том, чтобы поместить указатель на функцию внутри структуры. Затем функция объявляется вне структуры. Это отличается от класса в С++, где функция объявлена ​​внутри класса.

Например: кражу кода отсюда: http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html

struct t {
    int a;
    void (*fun) (int * a);
} ;

void get_a (int * a) {
    printf (" input : ");
    scanf ("%d", a);
}

int main () {
    struct t test;
    test.a = 0;

    printf ("a (before): %d\n", test.a);
    test.fun = get_a;
    test.fun(&test.a);
    printf ("a (after ): %d\n", test.a);

    return 0;
}

где test.fun = get_a; назначает функцию указателю в структуре, а test.fun(&test.a); вызывает его.

Ответ 6

Вы можете определить указатель функции в структуре на языке программирования C, который отличается от С++.