Вы должны создать один класс контекста.
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();
Теперь вы можете передать параметр любому контроллеру из всего приложения.
Это свойственно зависящий от реализации, так как Стандарт не включает такую возможность. Для 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
См. здесь
Вероятно, самый легкий путь состоит в том, чтобы использовать goto для перехода к маркировке в конце функции, но это является, вероятно, слишком ручным для вида вещи, на которую Вы смотрите.
Я выбрал бы перезапись обратного адреса на стеке. Это удалось бы как самое прозрачное. Замена free
будет только работать с выделенными "куче" "объектами".
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.
Если ваш компилятор поддерживает C99 (или даже значительную его часть), вы можете использовать массив переменной длины (VLA), например:
int f(int x) {
int vla[x];
// ...
}
Если используется память, gcc поддерживал / поддерживал это функция задолго до того, как она была добавлена в C99. Это (примерно) эквивалентно простому случаю:
int f(int x) {
int *vla=malloc(sizeof(int) *x);
/* ... */
free vla;
}
Однако он не позволяет вам делать ничего из того, что может делать dtor, например, закрывать файлы, подключаться к базе данных и т. Д.