如何在C中获取父对象?

时间:2019-07-08 19:03:24

标签: c

我需要在 C 中执行此操作。

我有一个带有属性x的typedef结构,我将根据typedef结构创建许多结构。如何从属性引用给定的父结构。实际上,这个x是一个函数,该函数需要知道另一个属性y是什么。

如何使用Javascript实现

this.super

我的代码

#define NOTHING

typedef struct $ {
    int (*x)(void);
    int Y NOTHING;
} $;
int AddOneToParentY (void) {
    //return This.super.Y +1; but in c instead of js
};

$ struct1 = {
    .X = AddOneToParentY,
    .Y = 3 NOTHING
};

$ struct2 = {
    .X = AddOneToParentY,
    .Y = 32 NOTHING
};

//When I call struct2.AddOneToParentY I should get 33

如何执行此操作?也许有些带有POUND定义宏的东西?

2 个答案:

答案 0 :(得分:1)

我认为您是在寻求C ++成员函数的this指针的类似物(相当于Java实例方法的this引用)。但是C没有成员函数或实例方法的类似物。更一般而言,它没有专门针对OOP的内置功能-毕竟这就是为什么C ++是从C派生出来的。

C结构可以具有一个成员,该成员是一个指向函数的指针,但是通过这样的指针调用该函数与直接调用它或通过指向它的另一个指针进行调用没有什么不同。没有区别,因此也无法分辨使用哪个指针来标识该功能,更不用说可以与之相关或存储在附近的数据了。

通常的C替代方法实质上是为需要的函数提供一个显式this指针(尽管它可以使用您喜欢的任何名称),并显式地传递它。另外,这可能会减少或消除在结构中存储指向它的指针的有用性。例如:

typedef struct {
    double x, y, radius;
} circle;

double computeArea(circle *c) {
    return c->radius * c->radius * 3.14159;
}

void moveTo(circle *c, double new_x, double new_y) {
    c->x = new_x;
    c->y = new_y;
}

int main(void) {
    circle a_circle = { .x = 1, .y = 1, .radius = 2 };

    printf("The area is %f\n", computeArea(&a_circle));
}

答案 1 :(得分:1)

C没有类和继承的概念,因此该语言中没有任何东西可以做这样的事情。

您需要声明函数以获取要修改的结构的指针并对其进行处理。同样,$也不是类型的好名字。您应该给它一个文本名称。

typedef struct mystruct {
    int Y;
} mystruct;

int AddOneToParentY (mystruct *s) {
    return s->Y + 1;
};

mystruct struct1 = {
    .Y = 3
};

mystruct struct2 = {
    .Y = 32
};


...

printf("result=%d\n", AddOneToParentY(&struct1);