Mi piacerebbe assicurarmi che nessuno sia in grado di cancellare alcun oggetto dalla mia gerarchia di classi, altrimenti usando un metodo di distruzione fornito.Come posso proteggere i distruttori per un'intera gerarchia di classi in modo gestibile?
La logica è che qualsiasi oggetto da questa gerarchia deve prendere uno speciale mutex di scrittura prima che inizi a distruggere se stesso per assicurarsi che gli oggetti non vengano cancellati mentre un altro thread li sta usando.
So che potrei evitare questo problema con il conteggio dei riferimenti, ma sarebbe un cambiamento molto più grande del sistema anche in termini di potenziale impatto sulle prestazioni e allocazione della memoria.
C'è un modo per rendere in modo efficiente/intelligente tutti i distruttori protetti in modo che le classi figlio possano chiamare i loro genitori distruttori mentre gli estranei devono utilizzare Distruggi?
Una soluzione che è sicura (cioè non marcisce) che ho inventato è quella di rendere privati tutti i distruttori e dichiarare ogni classe derivata come un amico della classe base ma preferirei qualcosa di più elegante, meno manuale e più facile da mantenere (come non richiedere di modificare le classi base per derivarne).
È disponibile qualcosa di simile? Forse qualche trucco intelligente che rende le cose "funzionanti" come vorrei?
ps. La soluzione che ho scelto per ora NON è quella di impedire a chiunque di chiamare delete in tutti i casi (l'ho appena reso protetto nella classe base), ma rilevare questa situazione e chiamare l'abort nel distruttore della classe base.
Aspetta un secondo, cosa c'è di sbagliato con limitandosi a dichiarare i distruttori come 'protected'? –
@AndyProwl Presumo il problema è che in tal caso, una classe derivata male può rendere pubblico il suo distruttore. – Angew
Esattamente - potrebbe anche essere un errore onesto commesso da qualcuno che mantiene il codice in un paio d'anni - preferirei non lasciare dietro di sé delle trappole :) – RnR