2012-09-23 6 views
7

Soy C++ 11-ing algún código. Tengo¿Usar unique_ptr para propiedad y puntero sin formato de lo contrario?

class X { /* */ }; 

class A { 
    std::vector<X*> va_x; 
}; 

class B { 
    std::vector<X*> vb_x; 
    std::vector<A> vb_a; 
}; 

El X * s de "va_x" dentro de mi clase de objetos Un punto que también se apunta la X * s de "vb_x" dentro de mi clase B.

Ahora que lo haría me gusta usar punteros inteligentes. Para mí, parece claro que la clase B tiene la propiedad de los objetos apuntados por el X * (en particular, porque mis casos A pertenecen a B)

por lo que debe utilizar un unique_ptr para X en el interior B:

class B { 
    std::vector<unique_ptr<X>> vb_x; 
    std::vector<A> vb_a; 
}; 

Mi pregunta es, ¿qué debo hacer para la clase A? ¿Debo mantener punteros sin procesar? Al hacer esto, en mis pruebas de unidad, debo admitir que conduce a cosas incómodas (OMI), por ejemplo (no se preocupe por encapsulación, que no es el punto):

unique_ptr<X> x(new X()); 
A a; 
a.va_x.push_back(&(*x)); //awkward, but what else can I do? 

A.vb_a.push_back(a); //ok 
B.vb_x.push_back(move(x)); //ok 
+0

Para preguntas futuras sobre C++ 11, por favor también escríbalas con C++. :) – Xeo

+1

¿No hizo una pregunta prácticamente idéntica anteriormente? – Puppy

+0

@DeadMG Bueno, el anterior es también sobre unique_ptr, pero esto no es lo mismo. Creo que –

Respuesta

9

Puede utilizar x.get(), que devolverá el puntero interno.

Aparte de eso, sí, usar punteros sin procesar para manejar referencias no propietarias es el camino a seguir, vea también this question.

+0

Ok, gracias. Pero esto no es mucho mejor, ¿verdad? Entonces, ¿debería usar punteros sin procesar? –

+0

@ BérengerBerthoul: No hay * nada * incorrecto con el uso de punteros sin formato, siempre que no posean nada. Como su nombre lo dice, deberían señalar las cosas y todo está bien. – Xeo

+0

Supongo que lo resolvió en ese momento. Soy muy cauteloso sobre estas nuevas características porque no vi ningún código real con ellas. Y como escuché "reemplazar tus punteros crudos por otros inteligentes" en todas partes, comencé a pensar que los punteros crudos ya no son necesarios (lo cual no es muy inteligente, lo admito ...) Gracias –

Cuestiones relacionadas