• ベストアンサー

構造体に関する質問

構造体に対する質問なんですが 構造体の中に関数を置く事はできるんですか???

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

>構造体に対する質問なんですが >構造体の中に関数を置く事はできるんですか??? 関数ポインタを置くことは可能なのは既出の通りです。 関数を置けるかというと、C++では可能です。 struct AAA{  int a;  int fnc(int val){   a = val;   return a+1;  } }; int main(){  int ret;  AAA aaa;  ret = aaa.fnc(1); } 要はclassと同じで コンストラクタやデストラクタも置けます。 ただしclassと違いデフォルトはpublic扱いです。

その他の回答 (3)

回答No.3

私も、関数へのポインタを保存するというの が一般的な利用法と思いますが、関数を普通 に宣言して、そのポインタをもとに関数の中 身を構造体中へコピーするということも可能 なはずです。 最近注目のデータ領域での実行防止(DEP)み たいなものですね。ウイルスを作るわけじゃ ありませんよね?

tukai
質問者

お礼

ウイルスは作らないですね・・(作れない っていうかCとかでウイルスが作れるんですか??(今度聞いてみよう) 本題 そう言う方法もあるんですかww かなり参考になりました 有難う御座いました

  • catby
  • ベストアンサー率65% (50/76)
回答No.2

関数そのものを記述する事はできませんが、関数のポインタならば置くことが出来ますよ。 例えば、 int test_func(int data); という関数を構造体test_structに置きたい場合、 struct test_struct {   int (*ptest_func)(int); }; と記述します。 そして、 struct test_struct *new_struct(void) {   struct test_struct *ptest;   ptest = malloc(sizeof(struct test_struct));   ptest->ptest_func = test_func;   return ptest; } といった形の初期化関数を作成すれば、 ptest->ptest_func(1); のような呼び出しは可能です。 test_func()をstatic関数にすれば、構造体のメンバーからしか実行出来ない関数にもできますね。

tukai
質問者

お礼

質問に答えてくださり有難う御座いました おかげで、疑問が解決しました

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.1

CかC++かで答え方が少し変わってきますが、 Cとしてお答えします。 構造体のメンバ宣言の場所には、 関数定義も関数宣言も書くことはできません。 ですが、関数ポインタなら宣言することができます。 int f(x){ return x*x; } struct foo { int a; int (*bar)(int); }; int main(){ struct foo foo1; foo1.a = 3; foo1.bar = f; return (foo1.bar)(foo1.a); // f(3) } のように書くことは可能です。

tukai
質問者

お礼

有難う御座いました 参考にもなりました

関連するQ&A