L'uso di una classe wrapper per i puntatori ha senso?

5

In C ++, i puntatori generalmente hanno molte più funzionalità associate a loro di quanto sia realmente necessario. Un modello di classe che racchiude un puntatore e rimuove la maggior parte delle funzioni meno utilizzate (aritmetica, indicizzazione, eliminazione). Ogni funzione potrebbe quindi decidere quanto è potente un puntatore che richiede e prendere il tipo appropriato.

Tuttavia, usare un simile tipo avrebbe senso in un progetto reale? Gli errori causati da un'aritmetica / eliminazione non intenzionale sono abbastanza comuni da giustificare lo sforzo aggiuntivo?

Per chiarire: sto considerando questo come un sistema a fianco di weak_ptr , shared_ptr , unique_ptr - questi tre sono grandi quando è coinvolta la proprietà, ma a volte non sono utili riferimenti nullable o resettabili.

    
posta Anton Golov 14.09.2012 - 00:04
fonte

3 risposte

2

Per me i "puntatori non possidenti" sono quasi inesistenti. Se sto memorizzando un puntatore su un oggetto in una variabile membro, allora c'è un qualche tipo di proprietà in gioco, anche se è una proprietà debole. Se questo è per passare argomenti a un metodo, allora ci sono riferimenti (che non hanno nessuno dei problemi che hai menzionato).

L'unica eccezione a cui riesco a pensare è quando si passa da una matrice raw, magari serializzando / deserializzando i dati binari. In tal caso, voglio essere in grado di eseguire la matematica del puntatore, ma non la cancellazione. Ma sarebbe incredibilmente difficile cancellare accidentalmente un puntatore, specialmente quando non uso quasi mai l'eliminazione!

    
risposta data 14.09.2012 - 02:46
fonte
3

Non sei sicuro dell'aritmetica, ma la proprietà del puntatore ( chi la cancella?) è una fonte importante di bug.

Potresti essere interessato a conoscere i puntatori intelligenti . Sicuramente modificano alcune delle semantica dei puntatori, il che li rende molto utili.

Come per i tipi nullable, potrebbero essere utili. Vedi Boost.Optional .

    
risposta data 14.09.2012 - 00:10
fonte
0

Avvolgere un puntatore è vicino all'idea giusta. Esplora le classi di valore. Costruisci le tue classi in modo che il puntatore sia un dettaglio di implementazione del comportamento reale. std :: string e std :: vector sono buoni esempi di classi di valore. Puoi copiarli, assegnarli. Funzionano come ti aspetti che un oggetto funzioni.

Questo talk di Sean Parent esplora come rendere il polimorfismo un dettaglio di implementazione . Ho usato questo modello più volte. Lo trovo abbastanza meraviglioso.

La semantica del valore è come evitare gli errori del puntatore. Nessun suggerimento, nessun errore.

    
risposta data 14.09.2012 - 03:22
fonte

Leggi altre domande sui tag