0
を関数ポインタを使用して構造パラメータを適用:初期化し、次のコードでは構造部材として
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
int b;
int (*func1)();
int (*func2)();
}STR_X2;
void init(STR_X2 self , int _a , int _b){
self.a = _a;
self.b = _b;
printf("Init a:%d, b:%d \n",self.a,self.b);
}
int multiply(STR_X2 self){
printf("Multiply a:%d, b:%d, res:%d\n",self.a,self.b,self.a*self.b);
return self.a*self.b;
}
int main(void) {
static STR_X2 val2;
val2.func1 = init;
val2.func2 = multiply;
printf("set values of a and b using init() function\n");
val2.func1(val2,3,5);
printf("result:%d\n",val2.func2(val2));
printf("\nset values of a and b directly\n");
val2.a=3;
val2.b = 5;
printf("result:%d\n",val2.func2(val2));
return EXIT_SUCCESS;
}
関数ポインタのような2つの部材を有するSTR_X2
構造を。
func1
はパラメータa
とb
のinit()
とSES値として設定されています。func1()
動作しませんを使用してパラメータを初期化する意味set values of a and b using init() function Init a:3, b:5 Multiply a:0, b:0, res:0 result:0 set values of a and b directly Multiply a:3, b:5, res:15 result:15
:
func2
がmultiply()
として設定し、コードを実行することによりa
とb
を乗算され、私は次の結果を持っています。
誰でもこのコードの何が間違っているかを知る手助けをすることができますか?
ありがとう
関数のパラメータとして 'STR_X2 *'を使用する必要があります。あるいは、このコードのどれもがほとんど意味を持ちません。 – Lundin
あなたのコードはひどくOOPの最も基本的なルール、すなわちプライベートカプセル化に違反しています。 – Lundin
'int(* func)()'を引数なしで使用すると、コードが安全になりません。私はまた、 "クラス初期化"関数(あなたの 'init'関数内で"インスタンス "を初期化することを検討しますが、多分異なる名前を付けました)。また、ファイルの外側からアクセスされないので、ネストされた関数を 'static'にすることもできます。割り当てられたオブジェクトを介してのみアクセスする必要があります。 – Myst