C ++ Enabled_Shared_From_This

C ++ Enabled_Shared_From_This
O ponteiro inteligente nos permite recuperar o ponteiro compartilhado deste ponteiro em uma função de membro. Para fazer isso, a classe enable_shared_from_this é usada. É uma classe base que permite ao codificador permitir que o objeto gere as instâncias adicionais para o ponteiro compartilhado, ou podemos dizer que permite o compartilhamento de propriedade dos ponteiros compartilhados. Um Enabled_Shared_From_This é uma técnica comum que permite que um objeto PTR compartilhado gerenciado obtenha um PTR compartilhado por conta própria sempre que necessário. Provavelmente é usado quando chamamos uma função de uma função de membro. Passamos "isso" como um argumento para essa função.

Passando isso como um ponteiro cru viola a restrição ao passar os ponteiros crus e compartilhados para o mesmo bloco de memória, tornando o ponteiro compartilhado inútil. Há também outro método para executar a mesma funcionalidade fornecida pelo enable_shared_from_sta classe. Mas esse método envolve o elenco dinâmico.

Ele fornece as seguintes funções de membro:

Construtor nos permite construir um objeto.

Destruidores Permita -nos destruir o objeto.

Operador “=”nos permite retornar a referência a "este" ponteiro.

Shared_from_this é usado para devolver o ponteiro compartilhado que compartilha a propriedade de "*this" ponteiro.

Fracos_from_this Retorna a propriedade do ponteiro fraco que compartilha a propriedade com o ponteiro "*this".

Sintaxe:

modelo classe enable_shared_from_this;

O mostrado anteriormente é a sintaxe para o Enable_shared_from_sta classe base. T indica o tipo de classe que precisa ser definido nesta sintaxe.

Exemplo 1:

Agora, tentamos um exemplo para a classe Enable_shared_from_ desta classe para verificar seu funcionamento e como ela é implementada. Vamos primeiro incluir nossos arquivos de cabeçalho. O primeiro é a "memória". O segundo é o "iostream". A memória é usada para permitir que o codificador realize as várias operações que são como alocação da heap de memória. O segundo é "iostream", onde é usado para permitir as operações de entrada e saída que são executadas no código para exibir os dados desejados para mostrar. Agora, usando a estrutura, definimos um objeto chamado "shrd_class". Declaramos nossa classe base "Enable_shared_from_This" para a qual passamos o "shrd_class". Isso significa que o objeto é uma classe base de enable_shared_from_this.

A estrutura é a maneira de agrupar as várias variáveis ​​relacionadas em um só lugar. No nosso caso, reunimos as variáveis ​​do ponteiro em uma classe que é "obj". Dentro do objeto, primeiro chamamos um construtor ou o objeto "shrd_class". Em seguida, declaramos uma função get_class () do ponteiro compartilhado do tipo "shrd_class", que exibe a mensagem "Propriedade compartilhada" quando a função "get_class" é chamada e retorna o método shared_from_this fornecido pela classe Enable_shared_from_this que ingere o objeto para gerar as instâncias do ponteiro compartilhado.

Agora, seguimos para a nossa principal função na qual declaramos um ponteiro compartilhado do objeto do tipo "shrd_class", ao qual nomeamos "pf1". Alocamos o ponteiro "shrd_class" usando a nova palavra -chave na pilha de memória. Em seguida, declaramos uma variável "pf2" do tipo automático ao qual atribuímos o "get_class ()" usando o ponteiro compartilhado "pf1". O operador “->” que usamos nesta linha significa que estamos acessando a função de membro de qualquer objeto, seja de uma união, estrutura, etc. usando o ponteiro. Neste exemplo, acessamos o método get_class () da classe de estrutura "Obj" usando o ponteiro "pf1".

#incluir
#incluir
struct shrd_class: public std :: enable_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);
pf2 automático = pf1-> get_class ();

Agora, ansioso pela nossa saída, exibimos com sucesso a mensagem, o que significa que o "PF1" é a instância do objeto "shrd_class" e compartilha a propriedade. Podemos ver isso na captura de tela que é exibida no seguinte:

Exemplo 2:

Vamos realizar outro exemplo no qual criamos dois ponteiros compartilhados que compartilham sua propriedade. Agora, vamos prosseguir para o nosso seguinte código exibido. Primeiro declaramos os arquivos de cabeçalho "iostream" e o arquivo de cabeçalho "Memory". Depois disso, declaramos um enable_shared_from_ desta classe base denominada "obj" usando estruturas. Agora, passamos para a nossa principal função, onde executamos o compartilhamento do objeto entre dois ponteiros compartilhados diferentes. Dentro da função principal, declaramos um ponteiro compartilhado chamado "shrd_ptr_1" e o segundo "shrd_ptr_2" do tipo "obj". Na próxima linha para o ponteiro "shrd_ptr_1", atribuímos o método "make_shared () que é usado para alocar um objeto do tipo" Obj "e retornar o objeto shared_ptr.

Em seguida, atribuímos nosso segundo ponteiro compartilhado_from_this (), que nos permite retornar o ponteiro que compartilha a propriedade do ponteiro "*this". Nisso, o "shrd_ptr_1" compartilha sua propriedade com o "shrd_ptr_2". Depois disso, usamos a declaração if () na qual passamos duas condições. O primeiro “shrd_ptr_1.proprietário_before (shrd_ptr_2) ”Neste proprietário_before é a função de membro que retorna o valor booleano true ou falso se este ponteiro compartilhado for ordenado antes do ponteiro passado.

No nosso caso, ele verifica se o "shrd" ptr_1 "é ordenado antes do" shrd_ptr_2 "ou não. A segunda condição é vice -versa. Nele, verificamos se o "shrd_ptr_2" é menor ou ordenado antes do "shrd_ptr_1". Se essas duas condições não ocorrerem, ela se move dentro da instrução if () e exibe a mensagem "shrd_ptr_1 e" shrd_ptr_2 "e compartilhe a propriedade. No final, retornamos o valor nulo, o que significa que o código é executado com sucesso sem nenhum erro.

#incluir
#incluir
struct obj: std :: enable_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-> shared_from_this ();
se (!SHRD_PTR_1.proprietário_before (shrd_ptr_2) && !SHRD_PTR_2.proprietário_before (shrd_ptr_1))
std :: cout<< "shrd_ptr_1 and shrd_ptr_2 share ownership";
retornar 0;

Como podemos ver na saída do código fornecido, ele exibe a mensagem com sucesso. Isso significa que a propriedade entre os dois ponteiros compartilhados “shrd_ptr_1” e os “shrd_ptr_2” são compartilhados com sucesso usando o Enable_shared_from_this Base Class e suas funções de membro.

Conclusão

Neste tutorial, descrevemos os métodos sobre como usar a classe Enable_shared_from_sta. Tentamos o nosso melhor para explicar o enable_shared_from_sta classe. Esperamos que este artigo seja útil para você entender melhor.