Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何设置其父结构类型的函数指针的参数_C_Oop_Structure_Function Pointers - Fatal编程技术网

C 如何设置其父结构类型的函数指针的参数

C 如何设置其父结构类型的函数指针的参数,c,oop,structure,function-pointers,C,Oop,Structure,Function Pointers,我尝试将函数指针定义为结构的成员,这些成员可以访问和修改结构的其他参数(如OOP中类的函数)。 为此,我有一个带有两个函数指针的结构: typedef struct{ int a; int b; int (*init)(); // line 4 int (*multiply)(); // line 5 }STR_X2; 其中,函数指针定义如下: void init(S

我尝试将函数指针定义为结构的成员,这些成员可以访问和修改结构的其他参数(如OOP中类的函数)。
为此,我有一个带有两个函数指针的结构:

    typedef struct{
        int a;
        int b;
        int (*init)();               // line 4
        int (*multiply)();           // line 5
    }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;
}
然后我在
main()
函数中使用如下结构:

    int main(void) {
            STR_X2* val2;
            val2->init = init;
            val2->multiply = multiply;

            val2->init(val2,7,5);
            printf("result:%d\n",val2->multiply(val2));

            return EXIT_SUCCESS;
        }

两个函数指针都有一个
STR_X2
类型的参数。但是从逻辑上讲,我不能定义这个参数,因为第4行和第5行没有定义结构
STR_X2

我的问题:
这种定义函数指针(无参数)的方法安全吗?
有没有更好的方法来访问此类函数指针中的结构成员?

基本上,这里需要的是结构类型的正向声明。可以通过使用结构标记来实现这一点。例如:

typedef struct STR_X2_S STR_X2;

struct STR_X2_S {
    int a;
    int b;
    int (*init)(STR_X2 *self, int _a, int _b);
    int (*multiply)(STR_X2 *self);
};

如果给结构命名
typedef struct name{
,那么可以在结构内部的声明中使用
struct name*
。(我并不认为编写
val2->multiply(val2)
而不仅仅是
multiply(val2)
有什么好处,但这可能只是我自己的问题)。对于真正的OOP,您可能希望查看不透明类型/不透明指针: