Можно ли эмулировать методы объекта в C? - PullRequest
2 голосов
/ 20 января 2012

Можно ли эмулировать методы объекта в C? Я хотел бы иметь возможность самостоятельно ссылаться на структуру в качестве параметра на аргумент функции-члена, например ::100100

struct foo {
    int a;
    int (*save)(struct foo *);
};

int
save_foo(struct foo *bar) {
    // do stuff.
}

struct foo *
create_foo() {
    struct foo *bar = malloc(sizeof(struct foo));
    bar->save = save_foo;

    return bar;
}

int
main() {
    struct foo *bar = create_foo();

    bar->a = 10;
    bar->save();
}

Где, bar->save(), на самом деле звонит save_foo(bar). Похоже на длинный выстрел, но это было бы довольно гладко:)

Ответы [ 4 ]

4 голосов
/ 20 января 2012

Нет, это невозможно.В C есть объектно-ориентированные библиотеки, но они явно передают объект "this" методу, как в

bar->save(bar);

. Пример этого стиля приведен в API C Berkeley DB, норассмотрите возможность использования C ++ или Objective-C, если вы хотите сделать OO на C-подобном языке.

2 голосов
/ 20 января 2012

В основном нет. Ссылка на функцию в C это просто указатель на то, где она находится, и когда вы вызываете ее, вы просто берете указатель из структуры, переходите туда и продолжаете выполнение без каких-либо знаний о контексте или стеке. некуда взять "это" у.

1 голос
/ 20 января 2012

Да, передайте bar на указатель функции save, и вы получите то, что C ++ делает скрытно (невидимо передает this в качестве первого параметра в метод). Вы не можете автоматически передать this (он же bar) в C.

1 голос
/ 20 января 2012

Ответ "Да".

Доказательство тому, что первые компиляторы C ++ вообще не были компиляторами. Они просто перевели код C ++ в код C. Компилятор CFront сделал это.

Я вижу из других ответов, что я, вероятно, неправильно понял ваш вопрос. Нет, синтаксис, который вы написали в вопросе, не будет работать на C. Вам нужно написать свой собственный тип препроцессора / переводчика, чтобы преобразовать вызов из bar->save() в foo_save(bar) или даже C3fooF4save(bar).

...