Re: [C++] Problema con puntatore this

Messaggioda ZfreS » 29/08/2019, 12:26

Riprendo questo thread per un altro dubbio riguardante il puntatore this suscitato leggendo del codice sulla gestione network delle qt. Il pezzo di codice è questo:
Codice:
 QNetworkAccessManagermanager = new QNetworkAccessManager(this);

Non capisco quale sia il ruolo del this. In generale cosa significa l'espressione:
Codice:
 A *a = new A(this)
dove A è una classe.
Potreste chiarirmi questo dubbio per favore?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1792 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Problema con puntatore this

Messaggioda vict85 » 29/08/2019, 15:49

Il this non svolge alcun ruolo particolare in quel codice. Insomma, sta semplicemente allocando dinamicamente un oggetto di tipo \(A\) e inizializzando la memoria usando un particolare costruttore (che ha come parametro un puntatore alla classe di partenza).

Questo tipo di approccio è abbastanza usato, anche se l'ho visto più spesso usare legato agli smart pointers. In ogni caso puoi cercare di capire quella linea nel seguente esempio:
Codice:
#include <stdint.h>
#include <iostream>

class B;

class A final
{
public:
    A( B* b )
        : b( b ){};

    void print( ) const;

private:
    B* b;
};

class B final
{
public:
    B( )
        : value( 0 )
        , a( nullptr ){};

    ~B( )
    {
        if ( a )
            delete a;
    };

    A*
    get_a( )
    {
        if ( !a )
        {
            a = new A( this );
        }
        return a;
    }

    void
    set_value( uint32_t new_value )
    {
        value = new_value;
    }

    uint32_t
    get_value( ) const
    {
        return value;
    }

private:
    uint32_t value;
    A* a;
};

void
A::print( ) const
{
    std::cout << ( b ? b->get_value( ) : 0 ) << std::endl;
};

int
main( )
{
    B b;
    const A* a = b.get_a( );
    a->print( );
    b.set_value( 121 );
    a->print( );
}
vict85
Moderatore
Moderatore
 
Messaggio: 9796 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Problema con puntatore this

Messaggioda claudio86 » 29/08/2019, 17:19

ZfreS ha scritto:Riprendo questo thread per un altro dubbio riguardante il puntatore this suscitato leggendo del codice sulla gestione network delle qt. Il pezzo di codice è questo:
Codice:
 QNetworkAccessManagermanager = new QNetworkAccessManager(this);

Non capisco quale sia il ruolo del this. In generale cosa significa l'espressione:
Codice:
 A *a = new A(this)
dove A è una classe.
Potreste chiarirmi questo dubbio per favore?


Gli oggetti della libreria Qt si auto-organizzano in alberi1.
L'oggetto che stai creando ha come "padre" (parent) l'oggetto *this.
Quando un oggetto viene distrutto (tramite delete o perché esce dallo scope), distrugge ricorsivamente a sua volta tutti i suoi oggetti figli (children).

https://doc.qt.io/qt-5/objecttrees.html

Puoi evitare questo comportamento passando nullptr invece di this, ma dovrai tenere traccia e distruggere manualmente i tuoi oggetti.

In generale, come dice vict85, stai semplicemente passando un puntatore a un costruttore.

Note

  1. Quelli relativi a classi che ereditano da QObject
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 523 di 1130
Iscritto il: 09/01/2011, 15:12

Re: [C++] Problema con puntatore this

Messaggioda ZfreS » 30/08/2019, 11:28

Ho capito, grazie mille!
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1793 di 4589
Iscritto il: 22/10/2016, 17:52

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite