2010-10-06 50 views

risposta

5

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).

+0

Penso che mi manca un punto; per quanto posso leggere, possiamo implementare l'esempio Employee con QSharedDataPointer, già con QSharedPointer. Qual è il trucco? –

+4

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. –

+1

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. –