|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Registered User
Iscritto dal: Oct 2006
Messaggi: 82
|
[c++] Un dubbio su qt
Sto studiando qt per un progetto universitario e ho qualche perplessità
su alcuni esempi che ho trovato nei tutorial: #include <QApplication> #include <QFont> #include <QPushButton> #include <QWidget> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = 0); }; MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { setFixedSize(200, 120); QPushButton *quit = new QPushButton(tr("Quit"), this); quit->setGeometry(62, 40, 75, 30); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } Come mai questa dichiarazione QPushButton *quit nel costruttore? Il puntatore quit non viene perduto all'uscita dal costruttore?Come mai non è presente il distruttore? Sono io che non ho capito bene qualcosa oppure questo è un metodo di procedere scorretto? Oppure visto che l'oggetto di tipo QPushButton puntato da quit deve esistere per tutta la durata del programma non ha senso dichiarare un distruttore e chi se ne frega se il puntatore quit viene perso dopo che si esce dal costruttore. La memoria allocata viene in ogni caso rilasciata all'uscita dal programma vero? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
visto così sembra un mem leak bello e buono, però magari la funzione connect gestice l'evento del bottone e il suo deallocamento.
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2001
Città: Lugano - CH
Messaggi: 523
|
Se imposti il parent del QPushButton a this, ovvero la classe che hai derivato da QWidget, alla chiamata del distruttore della tua classe madre, QWidget, vengono distrutti automaticamente tutti i figli.
vedi http://doc.trolltech.com/4.3/qwidget.html#dtor.QWidget Se avevi bisogno di lavorare ulteriormente con l' oggetto per cui hai allocato memoria ha senso mantenere un campo della classe che memorizzi il valore del puntatore.
__________________
Gran Visir consigliere dell' imperatore degli HWMetallers del forum... Colui che domina le nebbie funeree....le nebbie della solitudine e della disperazione...le nebbie dell' odio.. MacUpgradeClub |
![]() |
![]() |
![]() |
#4 |
Registered User
Iscritto dal: Oct 2006
Messaggi: 82
|
Ho una classe A la cui dichirazione è contenuta nel file a.h e la definizione sta nel file a.cpp, stessa cosa per la classe B contenuta in b.h e b.cpp.
Ora io voglio creare un oggetto della classe A all'interno della classe B e viceversa. Se includo a.h all'interno di b.h e viceversa succede un casino, se invece utilizzo il giochetto con le define per evitare la definizione multipla non funziona lo stesso. Come posso fare? |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Anche se probabilmente è sbagliata la rappresentazione in classi che hai realizzato. Comunque ti conveniva aprire un altro thread visto che hai cambiato argomento. |
|
![]() |
![]() |
![]() |
#6 | |
Registered User
Iscritto dal: Oct 2006
Messaggi: 82
|
Quote:
La forward declaration mi funziona solo se uso puntatori. Ovvero nella classe A posso fare B *b ma non posso creare un nuovo oggetto B b; insomma nient'altro. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:12.