C ++ habilitado_shared_from_this

C ++ habilitado_shared_from_this
El puntero inteligente nos permite recuperar el puntero compartido de este puntero en una función de miembro. Para hacer esto, se utiliza la clase enable_shared_from_ esta clase. Es una clase base que permite al codificador permitir que el objeto genere las instancias adicionales para el puntero compartido, o podemos decir que permite compartir la propiedad de los punteros compartidos. Un habilitado_shared_from_ esta es una técnica común que permite que un objeto PTR compartido administrado obtenga un PTR compartido por sí solo cuando sea necesario. Lo más probable es que se use cuando llamamos a una función de una función miembro. Pasamos "esto" como argumento a esa función.

Pasar esto como un puntero bruto infringe la restricción al pasar los punteros sin procesar y compartidos al mismo bloque de memoria, lo que hace que el puntero compartido sea inútil. También hay otro método para realizar la misma funcionalidad proporcionada por la clase enable_shared_from_this. Pero ese método involucra el reparto dinámico.

Proporciona las siguientes funciones de miembros:

Constructor nos permite construir un objeto.

Destructores Permítanos destruir el objeto.

Operador "="nos permite devolver la referencia a "este" puntero.

Shared_From_This se usa para devolver el puntero compartido que comparte la propiedad de "*this" puntero.

Débil_from_this Devuelve la propiedad del puntero débil que comparte la propiedad con el puntero "*this".

Sintaxis:

plantilla clase habilitable_shared_from_this;

La que se muestra anteriormente es la sintaxis para la clase Enable_Shared_From_This Base. T denota el tipo de clase que debe definirse en esta sintaxis.

Ejemplo 1:

Ahora, intentamos un ejemplo para la clase enable_shared_from_ esta clase base para verificar su funcionamiento y cómo se implementa. Permítanos incluir primero nuestros archivos de encabezado. El primero es la "memoria". El segundo es el "iostream". La memoria se usa para habilitar al codificador que realice las diversas operaciones que son como la asignación del montón de memoria. El segundo es "iOStream", donde se usa para permitir las operaciones de entrada-salida que se realizan en el código para mostrar los datos que se desean para mostrar. Ahora, usando la estructura, definimos un objeto llamado "shrd_class". Declaramos nuestra clase base "enable_shared_from_this" a la que pasamos el "shrd_class". Esto significa que el objeto es una clase base de habilitar_shared_from_this.

La estructura es la forma de agrupar las diversas variables relacionadas en un solo lugar. En nuestro caso, reunimos las variables del puntero en una clase que es "obj". Dentro del objeto, primero llamamos a un constructor o al objeto "shrd_class". Luego, declaramos una función get_class () del puntero compartido del tipo "shrd_class" que muestra el mensaje "propiedad compartida" cuando se llama la función "get_class" y devuelve el método shared_from_his proporcionado por la clase enable_shared_from_ esta clase que permite generar el objeto para generar para generar las instancias del puntero compartido.

Ahora, nos dirigimos a nuestra función principal en la que declaramos un puntero compartido del objeto de tipo "shrd_class" al que nombramos "PF1". Asignamos el puntero "shrd_class" usando la nueva palabra clave en el montón de memoria. A continuación, declaramos una variable "PF2" de tipo automático al que asignamos el "get_class ()" usando el puntero compartido "PF1". El operador "->" que usamos en esta línea significa que estamos accediendo a la función miembro de cualquier objeto, ya sea de una unión, estructura, etc. Usando el puntero. En este ejemplo, accedemos al método get_class () de la clase de estructura "OBJ" utilizando el puntero "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 (nuevo shrd_class);
auto pf2 = pf1-> get_class ();

Ahora, esperando nuestra salida, mostramos con éxito el mensaje, lo que significa que el "PF1" es la instancia del objeto "shrd_class" y comparte la propiedad. Podemos ver esto en la captura de pantalla que se muestra en lo siguiente:

Ejemplo 2:

Realicemos otro ejemplo en el que creamos dos punteros compartidos que comparten su propiedad. Ahora, procedamos a nuestro siguiente código mostrado. Primero declaramos los archivos de encabezado "iOStream" y el archivo de encabezado "memoria". Después de eso, declaramos una clase_shared_from_ esta clase base llamada "obj" usando estructuras. Ahora, nos movemos a nuestra función principal donde realizamos el intercambio del objeto entre dos punteros compartidos diferentes. Dentro de la función principal, declaramos un puntero compartido llamado "shrd_ptr_1" y el segundo "shrd_ptr_2" del tipo "obj". En la siguiente línea al puntero "shrd_ptr_1", asignamos el método "make_shared () que se utiliza para asignar un objeto de tipo" obj "y devolver el objeto shared_ptr.

A continuación, asignamos nuestro segundo puntero compartido_from_this () que nos permite devolver el puntero que comparte la propiedad del puntero "*this". En esto, el "shrd_ptr_1" comparte su propiedad con el "shrd_ptr_2". Después de eso, usamos la instrucción if () en la que pasamos dos condiciones. El primero "shrd_ptr_1.propietario_before (shrd_ptr_2) ”en este propietario_before está la función miembro que devuelve el valor booleano verdadero o falso si se ordena este puntero compartido antes del puntero pasado.

En nuestro caso, verifica si el "shRD" PTR_1 "se ordena antes del" shrd_ptr_2 "o no. La segunda condición es viceversa. En él, verificamos si el "shrd_ptr_2" es menor u ordenado antes del "shrd_ptr_1". Si ambas condiciones no ocurren, se mueve dentro de la instrucción if () y muestra el mensaje "shrd_ptr_1 y" shrd_ptr_2 "y comparte la propiedad. Al final, devolvemos el valor nulo, lo que significa que el código se ejecuta correctamente sin ningún error.

#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 ();
si (!shrd_ptr_1.propietario_before (shRD_PTR_2) && !shrd_ptr_2.propietario_before (shrd_ptr_1))
std :: cout<< "shrd_ptr_1 and shrd_ptr_2 share ownership";
regresar 0;

Como podemos ver en la salida del código dado, muestra el mensaje con éxito. Significa que la propiedad entre ambos punteros compartidos "shrd_ptr_1" y el "shrd_ptr_2" se comparten correctamente utilizando la clase enable_shared_from_ esta clase base y sus funciones miembros.

Conclusión

En este tutorial, describimos los métodos sobre cómo usar la clase enable_shared_from_ esta y la razón por la que se usan y cómo facilitan a los usuarios compartir la propiedad de punteros entre ellos. Hicimos todo lo posible para explicar la clase enable_shared_from_ esta clase. Esperamos que este artículo sea útil para que pueda comprender mejor.