Как получить родительский объект в C? - PullRequest
0 голосов
/ 08 июля 2019

Мне нужно сделать это в C .

У меня есть структура typedef со свойством x, и я создам много структур из структуры 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 ]

1 голос
/ 08 июля 2019

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);
1 голос
/ 08 июля 2019

Я думаю, что вы запрашиваете аналог this указателя на функции-члены C ++ (эквивалентно, this ссылка на методы экземпляра Java). Но C не имеет аналога функций-членов или методов экземпляра. В более общем смысле, он не имеет встроенных функций, специально предназначенных для ООП - поэтому 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...