Можно определить функцию внутри структуры C?
Я пытаюсь преобразовать код С++ в C, и у меня возникают проблемы.
Можно ли определить внутри структуры функцию?
Вот так:
typedef struct {
double x, y, z;
struct Point *next;
struct Point *prev;
void act() {sth. to do here};
} Point;
Ответы
Ответ 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;
}
Ответ 3
Нет, невозможно объявить функцию внутри структуры в C.
Это (одно из) фундаментальных различий между C и С++.
Смотрите эту тему: http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html
Ответ 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, который отличается от С++.