Qual è la differenza tra questi due tipi di puntatori? Per quanto posso leggere, QSharedPointer può gestire bene la situazione, quindi qual è la necessità di QSharedDataPointer?Differenza tra QSharedPointer e QSharedDataPointer?
risposta
Da Qt documentazione QSharedDataPointer
classe Il QSharedDataPointer rappresenta un puntatore ad un oggetto implicitamente condiviso. QSharedDataPointer rende facile la scrittura delle classi condivise implicitamente . QSharedDataPointer implementa il conteggio dei riferimenti thread-safe, assicurando che l'aggiunta di QSharedDataPointers alle classi rientranti non li renda non rientranti. La condivisione implicita è utilizzata da molte classi Qt per combinare la velocità e l'efficienza della memoria dei puntatori con la facilità d'uso delle classi . Vedere la pagina Classi condivisa per ulteriori informazioni.
Esempio Utilizzo -
#include <QSharedData>
#include <QString>
class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }
Per QSharedPointer
La classe QSharedPointer contiene un riferimento forte a un puntatore condiviso Il QSharedPointer è, puntatore automatico condivisa in C++. Si comporta come esattamente come un normale puntatore per gli scopi normali , compreso il rispetto per la costante . QSharedPointer cancellerà il puntatore che tiene in memoria quando diventa fuori campo, a condizione che nessun altro oggetti QSharedPointer facciano riferimento a .
> QSharedPointer<MyObject> obj =
> QSharedPointer<MyObject>(new MyObject);
Così, il QSharedDataPointer è usato per fare la creazione di classi implicititly condivisi. Mentre QSharedPointer è un puntatore intelligente conteggio di riferimento che punta alle classi.
EDIT
Durante la lettura Memory management in Qt?, ho trovato questo link http://labs.qt.nokia.com/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/. Una discussione davvero eccellente sui diversi punti intelligenti che Qt ha (l'attuale API ha 8).
- 1. QSharedPointer polimerico
- 2. Pimpl + QSharedPointer - Destructor = Disaster
- 3. La differenza tra $ * e $ @
- 4. Differenza tra $ # e $ {# @}
- 5. Differenza tra. e #
- 6. MySQL: Differenza tra ",", "e"
- 7. Differenza tra "o" e "||"
- 8. Differenza tra unwrapObservable e()
- 9. Differenza tra oggetto e *?
- 10. Differenza tra "**/* /" e "** /"?
- 11. Differenza tra jquery e $
- 12. CMake: differenza tra $ {} e "$ {}"
- 13. Differenza tra ". +" E ". +?"
- 14. VBA: Differenza tra & e +
- 15. Differenza tra numpy.logical_and e &
- 16. Differenza tra | = e^= css
- 17. Differenza tra `% in%` e `` ==
- 18. Differenza tra Dizionario e Hashtable
- 19. Differenza tra SCM e SVN
- 20. differenza tra RDLC e SSRS
- 21. Differenza tra REMOTE_HOST e REMOTE_ADDR
- 22. Differenza tra "\ n" e Environment.NewLine
- 23. Differenza tra toFixed() e toPrecision()?
- 24. Differenza tra strncpy e memcpy?
- 25. Differenza tra crittografia e hashing
- 26. Differenza tra Assembly.CreateInstance e Activator.CreateInstance?
- 27. Differenza tra coredata e sqlite
- 28. Differenza tra Html.RenderAction e Html.Action
- 29. differenza tra System.out.printf e String.format
- 30. Differenza tra UIViewContentModeScaleAspectFit e UIViewContentModeScaleToFill?
Penso che mi manca un punto; per quanto posso leggere, possiamo implementare l'esempio Employee con QSharedDataPointer, già con QSharedPointer. Qual è il trucco? –
QSharedDataPointer consente di implementare la copia superficiale, ovvero la condivisione di dati, di dati di classe tra più istanze della classe. Il documento di riferimento mostra la classe che eredita QSharedDataPointer. Quindi è INTERNO alla classe. QSharedPointer è un EXTERNAL della classe e implementa un puntatore di conteggio di riferimento su una singola istanza di una classe. Così questo consente a più puntatori di puntare alla stessa istanza di classe. –
QSharedDataPointer è un modo ingegnoso per implementare copy-on-write e stacca/copia il suo oggetto quando vi si accede in modo non costante. Ha la limitazione che l'argomento modello deve ereditare da QSharedData. –