Chiarimento costruttore classe che eredita QObject
-
Salve avrei bisogno di un chiarimento teorico.
In molti esempi di classi che ereditano da QObject, al costruttore della classe ereditata si passa spesso come argomento un puntatore ad un oggetto Qobject ma senza farlo puntare a nulla. Di seguito nella lista di inizializzazione si inizializza un oggetto QObject al cui costruttore si passo proprio quel puntatore, creando di fatto un collegamento a quell'oggetto padre (immagino sia corretto). La prima domanda è perchè e quali vantaggi porta.
Poi, nella funzione main viene inizializzato un puntatore della classe ereditata che punta a un oggetto dinamico della classe ereditata in cui lui stesso viene passato al costruttore.
Perchè non si fa la stessa cosa dichiarata nel prototipo di funzione?
Faccio un esempio praticoClass ereditata: public QObject{ ..... public : ereditata(QObject * parent = NULL) : QObject(parent) ..} Int main () { ... ereditata *erede = new ereditata(erede);
Grazie
-
E' spiegato meglio qui http://doc.qt.io/qt-5/objecttrees.html ma, in pratica, il maggior vantaggio e' che se distruggi il parent, tutti i figli si distruggono. se passi null al costruttore, invece, devi preoccuparti tu di chiamare
delete
odeleteLater()
sull'oggetto.In pratica agisce come un
std::unique_ptr
che pero' gestisce in automatico e in maniera sicura la disconnessione da signals e slots.se la classe base e' un
QWidget
(o una sua subclasse) il parent determina anche la finestra in cui il nuovo widget verra' posizionato.ereditata *erede = new ereditata(erede);
questo e' sbagliato, stai usando un dagling pointer e crasha se provi a farlo girare