Реализация RAII в чистом C?

Вы должны создать один класс контекста.

public class Context {
    private final static Context instance = new Context();
    public static Context getInstance() {
        return instance;
    }

    private Connection con;
    public void setConnection(Connection con)
    {
        this.con=con;
    }
    public Connection getConnection() {
        return con;
    }

    private TabRoughController tabRough;
    public void setTabRough(TabRoughController tabRough) {
        this.tabRough=tabRough;
    }

    public TabRoughController getTabRough() {
        return tabRough;
    }
}

Вам нужно просто установить экземпляр контроллера при инициализации с помощью

Context.getInstance().setTabRough(this);

, и вы можете использовать его из всего приложение только с помощью

TabRoughController cont=Context.getInstance().getTabRough();

Теперь вы можете передать параметр любому контроллеру из всего приложения.

60
задан unwind 24 April 2009 в 07:06
поделиться

6 ответов

Это свойственно зависящий от реализации, так как Стандарт не включает такую возможность. Для GCC cleanup атрибут выполняет функцию, когда переменная выходит из объема:

#include <stdio.h>

void scoped(int * pvariable) {
    printf("variable (%d) goes out of scope\n", *pvariable);
}

int main(void) {
    printf("before scope\n");
    {
        int watched __attribute__((cleanup (scoped)));
        watched = 42;
    }
    printf("after scope\n");
}

Печать:

before scope
variable (42) goes out of scope
after scope

См. здесь

75
ответ дан Johannes Schaub - litb 7 November 2019 в 14:16
поделиться

Вероятно, самый легкий путь состоит в том, чтобы использовать goto для перехода к маркировке в конце функции, но это является, вероятно, слишком ручным для вида вещи, на которую Вы смотрите.

3
ответ дан Jonathan Leffler 7 November 2019 в 14:16
поделиться

Я выбрал бы перезапись обратного адреса на стеке. Это удалось бы как самое прозрачное. Замена free будет только работать с выделенными "куче" "объектами".

1
ответ дан Roger Lipscombe 7 November 2019 в 14:16
поделиться

Эй, Вы пытаетесь воссоздать CFront!

0
ответ дан 7 November 2019 в 14:16
поделиться

Have you looked at alloca()? It will free when an var leaves scope. But to use it effecticly the caller must always do the alloca before sending it to things... If you were implementing strdup, well, you can't use alloca.

1
ответ дан 24 November 2019 в 17:19
поделиться

Если ваш компилятор поддерживает C99 (или даже значительную его часть), вы можете использовать массив переменной длины (VLA), например:

int f(int x) { 
    int vla[x];

    // ...
}

Если используется память, gcc поддерживал / поддерживал это функция задолго до того, как она была добавлена ​​в C99. Это (примерно) эквивалентно простому случаю:

int f(int x) { 
    int *vla=malloc(sizeof(int) *x);
    /* ... */
    free vla;
}

Однако он не позволяет вам делать ничего из того, что может делать dtor, например, закрывать файлы, подключаться к базе данных и т. Д.

9
ответ дан 24 November 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: