Quelle est la différence entre QPointer, QSharedPointer et QWeakPointer classes de Qt?
J'ai lu à partir de l'intervalle Qt documentations sur QPointer
, QSharedPointer
et QWeakPointer
classes. Il dit:
-
QPointer
est un modèle de classe qui fournit gardé des pointeurs vers des objets Qt et se comporte comme un simple pointeur C++, sauf qu'il est automatiquement mis à 0 lorsque l'objet référencé est détruit et non "en balançant les pointeurs" sont produites. -
QSharedPointer
classe contient une référence forte à un pointeur partagé. -
QWeakPointer
classe contient une faible référence à un pointeur partagé.
Mes questions est "Quelle est la différence entre ces classes?". j'.e quelle est la différence entre un pointeur vers un objet et une référence à un pointeur? Sont-ils tous des pointeurs vers des objets avec les différents mécanismes et les comportements?
- Je n'ai aucune idée, pourquoi ne vous posez pas de question sur
QScopedPointer
🙂 - Si je sais à propos de ceux-ci à l'apprentissage d'autres pour obtenir de plus simple.
- blog post. Ignorer la partie sur la prise de QWeakPointers suivi QObjects -- juste utiliser QPointer pour que.
Vous devez vous connecter pour publier un commentaire.
QPointer:
QPointer
ne peut pointer que versQObject
instances. Il sera automatiquement mis ànullptr
si le fait d'objet est détruit. C'est un faible pointeur spécialisé pourQObject
.Considérer ce fragment:
QSharedPointer
Une référence compté pointeur. L'objet sera supprimé seulement, lorsque tous les pointeurs partagés sont détruits. Équivalent à
std::shared_ptr
.Noter que tant qu'il y est un pointeur partagé, l'objet n'est pas supprimé!
QWeakPointer:
Peut contenir une faible référence à un pointeur partagé. Il n'empêchera pas l'objet de la destruction, et qui est tout simplement réinitialiser. Équivalent à
std::weak_ptr
, oùlock
est équivalent àtoStrongRef
.Ceci peut être utilisé si vous avez besoin d'accéder à un objet qui est contrôlé par un autre module.
D'utiliser un faible pointeur, vous devez le convertir en un
QSharedPointer
. Vous devriez jamais fonder une décision sur la faiblesse du pointeur valide. Vous ne pouvez utiliserdata()
ouisNull()
pour déterminer que le pointeur est null.Généralement, l'utilisation d'un faible pointeur, vous devez le convertir en un pointeur partagé car une telle opération permet de s'assurer que l'objet va survivre aussi longtemps que vous l'utilisez. C'est l'équivalent de "verrouillage" de l'objet pour l'accès et la seule façon correcte de l'utilisation de l'objet pointé par un faible pointeur.
QScopedPointer:
C'est juste une classe helper qui permet de supprimer l'objet référencé lorsque le pointeur est hors de portée. Ainsi, lie un objet alloué dynamiquement à une portée variable.
Vous pouvez l'utiliser pour RAII sémantique pour les habitants, par exemple:
L'élément seront également supprimés dans le cas d'une exception
Un autre cas d'utilisation peuvent être variables membres d'un objet. Ensuite, vous n'avez pas besoin d'écrire un destructeur pour ceux: