Non è una domanda "come si fa" è piuttosto "come farlo nel modo giusto"C++ 11 riferimento/puntatore non proprietario a unique_ptr?
Sto sviluppando un editor in Qt dove diversi widget visualizzano i bambini e le sue variabili (membro). Ognuno di questi widget dovrebbe contenere un riferimento/puntatore al figlio modificato per visualizzare e modificare le sue variabili membro.
Il primo tentativo è stato il vecchio modo ANSI C che ho imparato (e ancora un po 'bloccato) con un semplice puntatore raw agli oggetti usati. Funziona bene, ma poiché lo standard C++ 11 supporta puntatore intelligente e si sta utilizzando è consigliabile che sto cercando di usarli.
Il problema è, io non sono abbastanza sicuro che cosa è il "modo migliore" per usarli in questo caso ... Dopo aver letto Smart Pointers: Or who owns you baby? e Which kind of pointer do I use when? e pochi altri sono arrivato a conclusioni diverse:
Il Il primo è usare un valore *unique_ptr
poiché l'oggetto modificato è chiaramente il proprietario che crea e cancella anche i suoi figli. I widget si riferiscono semplicemente al bambino per mostrarlo o modificarlo. Il problema è come dovrebbero i widget fare riferimento al bambino ...
per ora sto semplicemente ancora utilizzando un indicatore grezzo ho ottenuto con il metodo della unique_ptr
get()
ma questo sembra un pò viziata per me. Posso ancora cancellare la chiamata accidentale sul puntatore e annullare i vantaggi del puntatore intelligente.
Il secondo approccio consiste nell'utilizzare uno shared_ptr
perché molti oggetti si riferiscono al bambino e lo modificano. Anche accidentalmente cancellarlo in un widget non farebbe male perché è ancora di proprietà di altri oggetti. Il problema è che lo possiedono. Quando voglio cancellarlo dall'oggetto modificato devo anche segnalare tutti i widget per cancellarlo prima che sia davvero finito. (questo sembra di nuovo imperfetto e incline agli errori)
Non sono molto contento in entrambi i modi. C'è un modo (er) pulito di indicare il figlio dell'oggetto unique_ptr
? O mi manca un approccio completamente diverso e migliore a questo problema?
È necessario che gli oggetti di riferimento vengano avvisati quando l'oggetto referenziato è distrutto? –
In questo tipo di situazioni, abbiamo davvero bisogno di [puntatori intelligenti stupidi] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3514.pdf). –
@BenjaminLindley Per ora devono essere avvisati di rimuovere i corrispondenti widget/controlli e di non usarli quando vengono cancellati. per esempio. un widget ha bisogno di ottenere le coordinate di un bambino per posizionarlo nel rendering di OpenGL. Ma cerco davvero di evitarlo perché ogni widget deve reagire al segnale emesso. Sarebbe più ideale se il proprietario potesse determinare se un oggetto esiste ancora o meno. – nils277