PDA

View Full Version : [c++] Un dubbio su qt


Sabonis
14-01-2008, 10:30
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?

vizzz
14-01-2008, 11:15
visto così sembra un mem leak bello e buono, però magari la funzione connect gestice l'evento del bottone e il suo deallocamento.

Della17
14-01-2008, 11:30
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.

Sabonis
17-01-2008, 10:33
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?

tomminno
17-01-2008, 12:46
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?

In questi casi serve la forward declaration.
Anche se probabilmente è sbagliata la rappresentazione in classi che hai realizzato.

Comunque ti conveniva aprire un altro thread visto che hai cambiato argomento.

Sabonis
17-01-2008, 14:29
In questi casi serve la forward declaration.
Anche se probabilmente è sbagliata la rappresentazione in classi che hai realizzato.

Comunque ti conveniva aprire un altro thread visto che hai cambiato argomento.
Sicuramente la rappresentazione in classi è sbagliata e si può evitare il problema in partenza...però volevo capire se c'è un modo per fare questo.
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.