Attualmente sto cercando di imparare le migliori pratiche in C ++ dopo essere passato da uno sfondo C #. Capisco che ci sono tre modi per gestire gli oggetti:
- Per valore (gli oggetti vengono copiati o spostati quando si passa dentro e fuori le funzioni)
- Per riferimento
- Tramite un puntatore condiviso o univoco (i puntatori non elaborati vengono disapprovati a meno che non siano realmente necessari)
In generale, ritengo che sia una buona pratica evitare di utilizzare i puntatori condivisi ma, mentre sto sviluppando molto codice di recente, sto scoprendo che inizialmente definisco qualcosa come un tipo di valore e poi finisco per doverlo rendere condiviso puntatore. Questa situazione si verifica così frequentemente che quasi tutti gli oggetti nel mio sistema si trovano in un puntatore condiviso! Questo sembra sbagliato.
La maggior parte delle mie classi assomiglia un po 'a questa:
class Container
{
public:
// ...other functions
std::shared_ptr<Thing> GetThing() const;
std::vector<std::shared_ptr<Thing>> GetThings() const;
private:
std::shared_ptr<Thing> thing;
std::vector<std::shared_ptr<Thing>> things;
}
Inizialmente questa classe avrebbe contenuto oggetti valore di tipo Thing, ma poi altre classi hanno bisogno di accedere a questi oggetti e quindi per evitare di copiarli quando vengono restituiti dalle funzioni 'getter' li ho messi in puntatori condivisi. Ciò significa che se si verificano modifiche a questi oggetti, il loro stato sarà coerente con il contenitore e gli oggetti che attualmente accedono alle "cose".
Perché questo sembra sbagliato e come posso migliorare questo approccio? Qual è il modo corretto di fare questo in C ++?