2011-12-02 21 views
13

¿Alguien conoce una implementación de shared_ptr y weak_ptr junto con un socio de inicialización diferido? Los requisitos de las clases fueron:punteros compartidos, débiles y flojos en C++

  • Una clase lazy_ptr que permite a un cliente para construir el objeto más tarde (en su caso), sin necesidad de la aplicación constructor

  • Una clase weak_lazy_ptr que tiene tres estados posibles : todavía no construido (no se bloqueará a un shared_ptr), construido (se bloqueará a un shared_ptr) y destruido (no se bloqueará a un shared_ptr)

I creó algunas clases que no hacían el trabajo por completo hace un tiempo (see CVu article here) que usaban shared_ptr y weak_ptr en su implementación. Los principales problemas con un modelo que utiliza punteros compartidos y débiles en lugar de integrar con ellos siguen:

  1. Una vez que todos lazy_ptr objetos ir fuera de alcance, las referencias débiles ya no se pueden bloquear, incluso si otros clientes están llevando a cabo shared_ptr versiones

  2. Construcción de objetos en diferentes hilos no se puede controlar

lo agradecería cualquier punteros a otros intentos de reconciliar estos problemas, o a cualquier trabajo i n progreso puede haber en esta área.

+6

Suena casi como 'shared_ptr >', ¿es así? – GManNickG

+2

@ user1078210 Quizás pueda encontrar más información [aquí] (http: // stackoverflow.com/questions/878166/is-there-c-perezoso-puntero). – ealves

+0

@GMan: 'boost :: optional' * does * permite la construcción diferida, pero' boost :: shared_ptr' también permite eso, por lo que no son necesarios, si es que lo entiendo. –

Respuesta

2

Para crear la construcción diferido que no requiere parámetros:

boost::bind(boost::factory<T*>(), param1, param2) creará un objeto de función que realiza el equivalente de new T(param1, param2) sin necesidad de los parámetros en el momento de la construcción.

Para crear un shared_ptr que apoya esta construcción diferida:

Bundle su fábrica con el estándar boost::shared_ptr (en una clase de su creación, por ejemplo), y you'llget los resultados que usted describe, incluyendo el weak_ptr adecuada funcionalidad ...

cualquier código que activa la aplaza la construcción por el cliente debe ejecutar:

your_shared_ptr.reset(your_factory()); 

Lo que desencadena código destrucción del objeto debería funcionar:

your_shared_ptr.reset(); 

El puntero compartida evauluate a true sólo durante la vida útil del objeto. Y si quiere que diferencie "no construido" de "destruido", puede configurar un bool después de que se ejecute la fábrica.