- ベストアンサー
構造体に関する質問
構造体に対する質問なんですが 構造体の中に関数を置く事はできるんですか???
- みんなの回答 (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)
- yamaichiro
- ベストアンサー率31% (77/243)
私も、関数へのポインタを保存するというの が一般的な利用法と思いますが、関数を普通 に宣言して、そのポインタをもとに関数の中 身を構造体中へコピーするということも可能 なはずです。 最近注目のデータ領域での実行防止(DEP)み たいなものですね。ウイルスを作るわけじゃ ありませんよね?
- catby
- ベストアンサー率65% (50/76)
関数そのものを記述する事はできませんが、関数のポインタならば置くことが出来ますよ。 例えば、 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関数にすれば、構造体のメンバーからしか実行出来ない関数にもできますね。
お礼
質問に答えてくださり有難う御座いました おかげで、疑問が解決しました
- hpsk
- ベストアンサー率40% (48/119)
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) } のように書くことは可能です。
お礼
有難う御座いました 参考にもなりました
お礼
ウイルスは作らないですね・・(作れない っていうかCとかでウイルスが作れるんですか??(今度聞いてみよう) 本題 そう言う方法もあるんですかww かなり参考になりました 有難う御座いました