いくつかのC++コードをCに変換しようとしていますが、いくつかの問題に直面しています。構造内で関数を定義するにはどうすればよいですか?
このような:
typedef struct {
double x, y, z;
struct Point *next;
struct Point *prev;
void act() {sth. to do here};
} Point;
struct
いいえ、 Cの a 内で関数を定義することはできません。
ただし、関数ポインターを持つことはできますが、関数ポインターをstruct
持つことは、C++ のメンバー関数とは大きく異なります。つまり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;
}
ただし、構造体に関数ポインターを含めることはできます。しかし、この方法ではありません
このように定義できます
例:
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;
}
C
内でメソッドを定義することは許可されていませんstruct
。構造体内で関数ポインタを次のように定義できます。
typedef struct {
double x, y, z;
struct Point *next;
struct Point *prev;
void (*act)();
} Point;
をインスタンス化するときはいつでも、特定の関数にポインタを割り当てる必要がありますstruct
。
いいえ、C では構造体内で関数を宣言することはできません。
これが、C と C++ の根本的な違い (の 1 つ) です。
このスレッドを参照してください: https://web.archive.org/web/20121024233849/http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html
アイデアは、構造体内の関数へのポインターを置くことです。次に、関数は構造体の外部で宣言されます。これは、関数がクラス内で宣言されるC++のクラスとは異なります。
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);
呼び出します。
C プログラミング言語では、C++ とは異なり、構造体でのみ関数ポインターを定義できます。