5

私は C で関数ポインターを使用する方法についていくつかの調査を行い、オブジェクト指向の種類のモデルを実行しようとしていました。そのようなものをモデル化するには、構造体に関数ポインタを追加して、一種の「オブジェクト」にする必要があると言われました。

私は C でのプログラミングにかなり慣れていないので、この質問は少しばかげているように思えるかもしれません (または非常に簡単に答えることができます) が、インターネット上で C++ に関する例を見つけただけで、それは私が探しているものではありません。

私の質問が何であるかを簡単に理解できるように、以下に例を示します。

try.h-ファイル:

struct thing {
  void (*a)(int, int);
};
void add(int x, int y);

try.c-ファイル:

#include <stdio.h>
#include <stdlib.h>
#include "try.h"

void add(int x, int y) {
  printf("x + y = %d\n", x+y);
}

int main(int argc, char* argv[]) {
  struct thing *p = (struct thing*) malloc(sizeof(struct thing));
  p->a = &add;
  (*p->a)(2, 3);
  free(p);
  p = NULL;
  return 0;
}

例として、私は always を持ちたいx = 2ので、の関数ポインターはstruct thingこの種のポインターになり、もうvoid (*a)(int)ありませvoid (*a)(int, int)ん。

x = 2関数ポインターを構造体に渡すときに引数をバインドするにはどうすればよいですか (行p->a = &add;)? これはCでも可能ですか?C++ では のようなものを見たことがありますが、C ではstd::bindこれを行うことができませんでした。

4

4 に答える 4

3

関数ポインターは、それが指す関数と同じ署名 (型と引数) を持っている必要があるため、実際にはそのようにすることはできません。

バインドと呼び出しを別のいくつかの関数でラップできます。

struct thing {
  void (*a)(int, int);
  int x;
};
...
void bind1st( struct thing *p, int arg )
{
  p->x = arg;
}

void call( struct thing *p, int arg )
{
  p->a( p->x, arg );
}

これを少し試してみたいと思うかもしれませんが、それで始められるはずです。

于 2013-10-10T20:04:01.120 に答える