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 pratico

    Class 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 o deleteLater() 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



  • Grazie. Perfetto


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.