Johnn
14-07-2008, 19:00
Per un progetto universitario devo realizzare in c++ una cosa del genere (in realtà le classi figlie sono di più ma il concetto non cambia):
http://img353.imageshack.us/img353/295/classdiagram1yv6.jpg (http://imageshack.us)
Ovviamente devo gesitre opportunamente le deallocazioni degli oggetti creati dinamicamente. Il problema è che molte delle classi figlie sono dipendenti tra loro ed hanno metodi che istanziano nuovi oggetti, ne modificano di già esistenti, ecc. In altre parole chi alloca non può deallocare un certo oggetto.
Per avere comunque una opportuna deallocazione della memoria non più in uso, ho letto in rete dell'idioma RAII e anche degli smart pointer. Vorrei evitare l'uso di quest'ultimi, ma penso sia adatta l'architettura seguente:
http://img179.imageshack.us/img179/417/classdiagramxb6.th.jpg (http://img179.imageshack.us/my.php?image=classdiagramxb6.jpg)
che ho adattato da questo esempio:
class WindowManager {
private:
Window* w;
public:
WindowManager() {
w = WindowFactory::createWindow();
}
Window* getWindow() {
return w;
}
~WindowManager() {
delete w;
}
}
class TestWindow {
void disegna() {
WindowManager m;
Window* w = m.getWindow();
/* utilizza w... */
} /* ora m è out of scope: w è deallocata */
}
preso da qui:
http://programminghacks.wordpress.com/category/c/
L'idea è che le classi A, B, ecc. hanno costruttori privati e quindi possono essere istanziate solo con le rispettive classi Manager: saranno queste che istanziate staticamente allocheranno e distruggeranno gli oggetti in maniera praticamente automatica.
Ovviamente se prima il codice di un metodo era ad esempio:
...
return new B(this->getAttribute());
Ora dovrà essere:
...
Manager b;
b.createB(this->getAttribute());
return b.getInstance();
Ho sbagliato qualcosa?
Grazie.
http://img353.imageshack.us/img353/295/classdiagram1yv6.jpg (http://imageshack.us)
Ovviamente devo gesitre opportunamente le deallocazioni degli oggetti creati dinamicamente. Il problema è che molte delle classi figlie sono dipendenti tra loro ed hanno metodi che istanziano nuovi oggetti, ne modificano di già esistenti, ecc. In altre parole chi alloca non può deallocare un certo oggetto.
Per avere comunque una opportuna deallocazione della memoria non più in uso, ho letto in rete dell'idioma RAII e anche degli smart pointer. Vorrei evitare l'uso di quest'ultimi, ma penso sia adatta l'architettura seguente:
http://img179.imageshack.us/img179/417/classdiagramxb6.th.jpg (http://img179.imageshack.us/my.php?image=classdiagramxb6.jpg)
che ho adattato da questo esempio:
class WindowManager {
private:
Window* w;
public:
WindowManager() {
w = WindowFactory::createWindow();
}
Window* getWindow() {
return w;
}
~WindowManager() {
delete w;
}
}
class TestWindow {
void disegna() {
WindowManager m;
Window* w = m.getWindow();
/* utilizza w... */
} /* ora m è out of scope: w è deallocata */
}
preso da qui:
http://programminghacks.wordpress.com/category/c/
L'idea è che le classi A, B, ecc. hanno costruttori privati e quindi possono essere istanziate solo con le rispettive classi Manager: saranno queste che istanziate staticamente allocheranno e distruggeranno gli oggetti in maniera praticamente automatica.
Ovviamente se prima il codice di un metodo era ad esempio:
...
return new B(this->getAttribute());
Ora dovrà essere:
...
Manager b;
b.createB(this->getAttribute());
return b.getInstance();
Ho sbagliato qualcosa?
Grazie.