2012-09-23 9 views
7

I am C++ 11 -ing un po 'di codice. HoUtilizzare unique_ptr per la proprietà e il puntatore raw in caso contrario?

class X { /* */ }; 

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

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

X * s di "va_x" dentro la mia classe Un punto da oggetti che sono anche puntato dal X * s di "vb_x" dentro la mia classe B.

ora vorrei piace usare puntatori intelligenti. Per me, sembra chiaro che la classe B ha la proprietà degli oggetti appuntiti dal X * (in particolare perché le mie istanze di A appartengono a B)

Quindi dovrei usare un unique_ptr per X all'interno B:

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

La mia domanda è: cosa devo fare per la classe A? Dovrei mantenere i puntatori grezzi? In questo modo, nel mio test di unità, devo ammettere che conduce a cose scomode (IMO), per esempio (non preoccuparti incapsulamento, non è questo il 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

Per domande future su C++ 11, contrassegnali con C++. :) – Xeo

+1

Non hai mai fatto una domanda praticamente identica in precedenza? – Puppy

+0

@DeadMG Beh, il precedente riguarda anche unique_ptr ma questa non è la stessa cosa penso che sia –

risposta

9

È possibile utilizzare x.get(), che restituirà il puntatore interno.

Oltre a ciò, sì, utilizzare i puntatori non elaborati per gestire i riferimenti non proprietari è la strada da percorrere, vedere anche this question.

+0

Ok grazie. Ma non è molto meglio vero? Quindi dovrei usare comunque dei puntatori grezzi? –

+0

@ BérengerBerthoul: C'è * niente * sbagliato nell'usare puntatori grezzi fintanto che non possiedono nulla. Come dice il nome, dovrebbero solo indicare le cose e tutto è OK. – Xeo

+0

Indovina che l'ha risolto allora. Sono molto cauto riguardo a queste nuove funzionalità perché non ho visto alcun codice reale con loro. E come ho sentito "sostituire i tuoi puntatori grezzi con quelli intelligenti" ovunque, ho iniziato a pensare che i puntatori grezzi non sono più necessari (che non è molto intelligente ammetto ...) Grazie –

Problemi correlati