Non ho mai usato alcun tipo di puntatore intelligente, ma continuo a leggerli quasi ovunque quando l'argomento è puntato. Capisco che ci sono situazioni in cui i puntatori intelligenti sono molto più piacevoli con i puntatori grezzi, perché in qualche modo gestiscono la proprietà del puntatore. Tuttavia, non lo so ancora, dov'è il confine tra "Non ho bisogno di puntatori intelligenti per questo" e "questo è un caso per i puntatori intelligenti".Perché dovrei voler utilizzare un puntatore intelligente in questa situazione?
Diciamo, ho la seguente situazione:
class A {
public:
double get1(){return 1;}
double get2(){return 2;}
};
class SomeUtilityClass {
public:
SomeUtilityClass(A* a) : a(a) {}
double getResult(){return a->get1() + a->get2();}
void setA(A* a){a = a;}
private:
A* a;
};
int main(int argc, char** argv) {
A a;
SomeUtilityClass u(&a);
std::cout << u.getResult() << std::endl;
A a2;
u.setA(&a2);
std::cout << u.getResult() << std::endl;
return 0;
}
Si tratta naturalmente di un esempio semplificato. Quello che intendo è che lo SomeUtilityClass
non dovrebbe "possedere" un'istanza di A
(perché è solo una classe di utilità), quindi mantiene solo un puntatore.
Per quanto riguarda il puntatore, l'unica cosa che mi rendo conto di quello che poteva andare storto è:
SomeUtilityClass
può essere istanziata con un puntatore nullo- L'oggetto puntato può essere cancellato/uscire campo di applicazione, senza la
SomeUtilityClass
accorgersene
Come potrebbe un puntatore aiuto intelligente per evitare questo problema? Quali altri benefici otterrei utilizzando un puntatore intelligente in questo caso?
PS: So che ci sono diverse domande sui puntatori intelligenti (ad esempio this one). Tuttavia, sarei grato se potessi parlarmi dell'impatto su questo particolare esempio.
I puntatori grezzi catturano perfettamente il concetto di riferimento non proprietario a dati con una durata scoped. Non dovresti usare i puntatori intelligenti qui. – Mankarse
Se stai usando 'new' in the wild, è un suggerimento abbastanza forte che potresti aver bisogno di un puntatore intelligente. Se stai usando 'new []', è un suggerimento abbastanza forte che potresti aver bisogno di 'std :: vector' o di un altro contenitore. – JBL
Se un 'nullptr' non ha senso, potresti prendere in considerazione un riferimento o' std :: reference_wrapper'. –