È normale ereditare da enable_shared_from_this
solo per poter restituire le funzioni membro come l'intenzione primaria, senza intenzione di esporre l'API enable_shared_from_this
nella classe derivata. shared_ptr
.Il mandato standard enable_shared_from_this deve essere ereditato pubblicamente? Perché?
Dal momento che per utilizzare lo enable_shared_from_this
è necessario farlo attraverso l'ereditarietà pubblica (lo standard richiede questo? Qual è la motivazione?), Questo non può essere raggiunto e l'API enable_shared_from_this
è forzata in API pubbliche di classe derivata.
Inerendo enable_shared_from_this
privatamente e facendo shared_ptr
una classe di amici funziona su clang accoppiato con libC++, ma non funziona con stdlibC++.
Dal private enable_shared_from_this
+ friend shared_ptr
(o ereditarietà protetta) sembra coprire questo caso d'uso, non dovrebbe essere sufficiente dallo standard per il montaggio come soluzione per il problema "condiviso da questo"?
Si potrebbe provare ad ereditare 'protected', ad esempio' class T: protected std :: enable_shared_from_this {...}; '? Non l'ho provato da solo –
@ChrisBeck ok grazie. Immagino che la domanda continui a essere valida, se non si desidera fare anche questo ('protected'). –
Penso che non sia possibile che il meccanismo 'shared_from_this' funzioni se l'ereditarietà è totalmente privata. Il modo in cui funziona, se ho capito bene, è che la struttura di controllo per 'shared_ptr' (il conteggio dei riferimenti) è memorizzata in un prefisso nella tua classe, quindi, c'è un membro dei dati in' std :: enable_shared_from_this ' . Per fare un 'shared_ptr' da' this', deve essere in grado di eseguire il cast statico 'this' e trovare il contatore ref. Anche 'std :: make_shared' deve essere in grado di rilevare cose come questa nel tuo tipo. Se l'ereditarietà è privata, suppongo che non possano farlo. Non sono sicuro .. –