C ++ anabled_shared_from_this

C ++ anabled_shared_from_this
Il puntatore intelligente ci consente di recuperare il puntatore condiviso da questo puntatore in una funzione membro. Per fare questo, viene utilizzata la classe abilita_shared_from_. È una classe base che consente al programmatore di consentire all'oggetto di generare istanze aggiuntive per il puntatore condiviso, oppure possiamo dire che consente la condivisione della proprietà dei puntatori condivisi. Un abilitable_shared_from_this è una tecnica comune che consente a un oggetto PTR condiviso gestito di ottenere un PTR condiviso da solo ogni volta che è necessario. Molto probabilmente viene utilizzato quando chiamiamo una funzione da una funzione membro. Passiamo "questo" come argomento a quella funzione.

Passarlo mentre un puntatore grezzo viola la restrizione al passaggio dei puntatori grezzi e condivisi allo stesso blocco di memoria, rendendo il puntatore condiviso inutile. Esiste anche un altro metodo per eseguire la stessa funzionalità fornita da enable_shared_from_ questa classe. Ma quel metodo coinvolge il cast dinamico.

Fornisce le seguenti funzioni del membro:

Costruttore ci consente di costruire un oggetto.

Distruttori Consentirci di distruggere l'oggetto.

Operatore "="ci consente di restituire il riferimento a "questo" puntatore.

Condiviso_from_chis viene utilizzato per restituire il puntatore condiviso che condivide la proprietà di "*questo" puntatore.

Debole_from_chis Restituisce la proprietà del puntatore debole che condivide la proprietà con il puntatore "*questo".

Sintassi:

modello classe abilita_shared_from_this;

Il precedente mostrato è la sintassi per la classe di base abilita_shared_from_this. T indica il tipo di classe che deve essere definito in questa sintassi.

Esempio 1:

Ora, proviamo un esempio per la classe base abilita. Includiamo prima i nostri file di intestazione. Il primo è la "memoria". Il secondo è "iostream". La memoria viene utilizzata per consentire al coder di eseguire le varie operazioni che sono come allocazione del mucchio di memoria. Il secondo è "iostream" in cui viene utilizzato per consentire le operazioni di input-output eseguite nel codice per visualizzare i dati che si desidera mostrare. Ora, usando la struttura, definiamo un oggetto chiamato "shrd_class". Dichiariamo la nostra classe di base "abilita_shared_from_this" a cui passiamo il "shrd_class". Ciò significa che l'oggetto è una classe base di abilita_shared_from_thes.

La struttura è il modo di raggruppare le varie variabili correlate in un unico posto. Nel nostro caso, raccogliamo le variabili del puntatore in una classe che è "OBJ". All'interno dell'oggetto, chiamiamo prima un costruttore o l'oggetto "shrd_class". Quindi, dichiariamo una funzione get_class () del puntatore condiviso del tipo "shrd_class" che visualizza il messaggio "proprietà condivisa" quando viene chiamata la funzione "get_class" e restituisce il metodo condiviso_from_ questo metodo fornito dalla classe abilita le istanze del puntatore condiviso.

Ora, ci dirigiamo verso la nostra funzione principale in cui dichiariamo un puntatore condiviso del tipo "shrd_class" a cui chiamiamo "PF1". Allociamo il puntatore "shrd_class" usando la nuova parola chiave nel mucchio di memoria. Successivamente, dichiariamo una variabile "PF2" di tipo automatico a cui assegniamo "get_class ()" usando il puntatore condiviso "PF1". L'operatore “->” che utilizziamo in questa linea significa che stiamo accedendo alla funzione membro di qualsiasi oggetto sia che si tratti di un sindacato, una struttura, ecc. usando il puntatore. In questo esempio, accediamo al metodo get_class () della classe di struttura "OBJ" usando il puntatore "PF1".

#includere
#includere
struct shrd_class: public std :: abilita_shared_from_this
shrd_class ()
std :: shared_ptrget_class ()
std :: cout<< "ownership shared" << std::endl;
return shared_from_this ();

;
int main ()
std :: shared_ptr pf1 (new shrd_class);
auto pf2 = pf1-> get_class ();

Ora, in attesa del nostro output, abbiamo visualizzato correttamente il messaggio, il che significa che il "PF1" è l'istanza dell'oggetto "shrd_class" e condivide la proprietà. Possiamo vederlo nello screenshot visualizzato nel seguente:

Esempio 2:

Eseguiamo un altro esempio in cui creiamo due puntatori condivisi che condividono la loro proprietà. Ora, procediamo al nostro codice visualizzato seguente. Dichiariamo prima i file di intestazione "iostream" e il file di intestazione "memoria". Successivamente, dichiariamo una classe di base abilita_shared_from_this denominata "obj" usando le strutture. Ora passiamo alla nostra funzione principale in cui eseguiamo la condivisione dell'oggetto tra due diversi puntatori condivisi. All'interno della funzione principale, dichiariamo un puntatore condiviso chiamato "shrd_ptr_1" e il secondo tipo "shrd_ptr_2" di tipo "OBJ". Nella riga successiva al puntatore "shrd_ptr_1", assegniamo il metodo "make_shared () che viene utilizzato per allocare un oggetto di tipo" obj "e restituire l'oggetto condiviso.

Successivamente, assegniamo il nostro secondo puntatore condiviso_from_this () che ci consente di restituire il puntatore che condivide la proprietà del puntatore "*questo". In questo, "shrd_ptr_1" condivide la sua proprietà con "shrd_ptr_2". Successivamente, utilizziamo l'istruzione IF () in cui passiamo due condizioni. Il primo "shrd_ptr_1.proprietario_before (shrd_ptr_2) ”in questo proprietario_before è la funzione membro che restituisce il valore booleano vero o falso se questo puntatore condiviso è ordinato prima del puntatore passato.

Nel nostro caso, controlla se il "SHRD" PTR_1 "è ordinato prima del" Shrd_ptr_2 "o no. La seconda condizione è viceversa. In esso, controlliamo se "Shrd_ptr_2" è inferiore o ordinato prima del "shrd_ptr_1". Se entrambe queste condizioni non si verificano, si sposta all'interno dell'istruzione if () e visualizza il messaggio "Shrd_ptr_1 e" shrd_ptr_2 "e condividi la proprietà. Alla fine, restituiamo il valore null, il che significa che il codice esegue correttamente senza alcun errore.

#includere
#includere
struct obj: std :: abilita_shared_from_this ;
int main ()
std :: shared_ptr shrd_ptr_1, shrd_ptr_2;
shrd_ptr_1 = std :: make_shared ();
shrd_ptr_2 = shrd_ptr_1-> condiviso_from_this ();
Se (!shrd_ptr_1.proprietario_before (shrd_ptr_2) && !shrd_ptr_2.proprietario_before (shrd_ptr_1))
std :: cout<< "shrd_ptr_1 and shrd_ptr_2 share ownership";
restituzione 0;

Come possiamo vedere nell'output del codice dato, visualizza il messaggio correttamente. Significa che la proprietà tra i entrambi i puntatori condivisi "shrd_ptr_1" e "shrd_ptr_2" sono condivise correttamente usando la classe di base abilita_shared_from_this e le funzioni del suo membro.

Conclusione

In questo tutorial, abbiamo descritto i metodi su come utilizzare la classe abilita_shared_from. Abbiamo fatto del nostro meglio per spiegare la classe abilita. Speriamo che questo articolo sia utile per te per avere una migliore comprensione.