QSharedPointer, comment passer autour, et ai-je besoin?
Été à essayer de comprendre pointeur partagé depuis quelques jours maintenant et il se sent comme je ne peux pas sembler obtenir. Vous ne savez pas si c'est juste pour évidente ou si c'est trop compliqué. Tout d'abord, quelqu'un pourrait-il me donner un exemple où vous auriez FAIT une utilisation partagée des pointeurs. Les exemples sur Wikipédia ne fait pas de sens pour moi. Et comment voulez-vous passer un pointeur partagé à une autre fonction ou de créer un objet avec un pointeur partagé. Alors, comment voulez-vous de les passer et où l'utiliser? AUCUNE des informations ou des exemples serait génial.
Aussi, j'ai ce problème lorsque je ne sais pas quoi utiliser. J'ai cette fonction où j'alloue un QFile
et passe à une fonction dans une autre classe. Cette fonction prend le fichier en tant que QIODevice*
et crée ensuite un objet contenant le fichier. Je me demandais ce que la meilleure solution serait ici et comment (si je doit) utiliser un pointeur partagé ici? Comment puis-je faire un pointeur partagé avec <QFile>
et le passer dans la où la fonction prend <QIODevice>
. Se sent comme je n'ai pas partagé les pointeurs à tous...
Mon autre approche serait de se poser la répartition de la QFile
dans un QScopedPointer
. J'ai ensuite passer à la classe et lors de la création de l'objet sur lequel le fichier sera stocké, j'utilise QPointer
ou QScopedPointer
. À la fin de la première fonction d'appel que je devrais l'appeler() à droite?
function () {
QScopedPointer<QFile> item(new QFile("filename"));
SomeClassObject->doStuff(item.data());
item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice *item) {
_currentObject = new MyObject(item); //should _currentObject be a smartpointer?
...
}
---------------------------------
class MyObject {
QPointer<QIODevice> _item;
...
MyObject(QIODevice *item) { _item = item; }
}
J'ai donc besoin d'un moyen pour stocker des pointeurs et une façon de les gérer lors de la création de la "nouvelle" déclenche une exception.
OriginalL'auteur chikuba | 2012-03-23
Vous devez vous connecter pour publier un commentaire.
Le point de partage des pointeurs (et d'autres semblables wrappers pour des pointeurs) est de gérer la destruction du pointeur vers l'objet correctement. C'est au lieu d'avoir à manuellement, assurez-vous de supprimer la dernière copie (et uniquement la dernière copie), le pointeur prend soin de lui pour vous quand elle est hors de portée. La partie commune signifie que vous pouvez créer des copies de cet objet wrapper (le pointeur partagé objet) et de "partager" le pointeur vers l'objet entre les copies (comme si vous avez fait une copie d'un pointeur normal) avec l'avantage supplémentaire décrit ci-dessus.
Comme pour votre code,
SomeClass::doStuff()
devrait avoir unQScopedPointer<QFile>
paramètre (au lieu d'unQIODevice*
un) que vous êtes de passage àitem
, qui a ce type de.Même avec
MyObject
'constructeur: il prennent un paramètre deQPointer<QIODevice>
ouQSharedPointer<QIODevice>
type. En général, partout où vous utiliseriez des pointeurs, l'utilisationQSharedPointer
à la place (avec le type de modèle). Cela vous évitera des maux de tête liés à l'accès à des objets supprimés plus tard.Bien sûr, parfois vous avez réellement besoin les premières
QIODevice
pointeur (par exemple, pour la troisième partie de la bibliothèque d'appel), alors vous devez utiliser ledata()
fonction de membre du pointeur partagé objet. Assurez-vous de ne pas persister (c'est-à stocker ou copier-delà de ce qui est nécessaire) le retour de l'pointeur brut, parce que cela va miner le but du partage de pointeurs -- l'partagé pointeurs de ne pas savoir à propos de votre extra brut pointeur qui n'est pas sous la gestion du pointeur partagé objets.EDIT:
take()
communiqués de la propriété de la pointe-de objet à partir d'une étendue de pointeur, donc lorsque l'étendue de pointeur est détruit, il ne supprime pas l'objet. Vous ant ot l'utiliser dans une situation où vous avez transféré la propriété de quelque chose d'autre, comme dans votre cas àMyObject
.QScopedPointer
. Soit faire un référence (éviter les pointeurs au total), de la laisser un pointeur brut (autoriser tous géré de type pointeur) ou de faire un pointeur partagé (éviter de copier et de faire_currentObject
part de l'objet, si c'est une possibilité). Passage d'une portée pointeur devra être faite par référence et puis vous forcer le choix de pointeur intelligent sur vos utilisateurs, ce qui n'est pas une belle chose à faire (si ils sont en utilisant un autre type de pointeur intelligent?)Je ne vois pas pourquoi en passant le pointeur partagé (au lieu de la matière première) est un problème (en plus de l'obligation pour le type particulier). Je pense que c'est plus sûr que le passage de pointeur brut (par exemple, vous pouvez stocker le paramètre à un conteneur global, sans crainte de l'appelant à la suppression de sous vous). Le pointeur partagé certainement doesw pas être par référence, le constructeur par copie logique assurez-vous que la copie se comporte de façon appropriée. On peut certainement passer à l'objet sous-jacent par référence, mais alors pourquoi utiliser des pointeurs?
il a besoin de prendre un QIODevice car je ne vais pas l'utiliser seulement avec QFile. Il existe d'autres situations dans mon code où les fonctions ont besoin de prendre un basetype
Vous pouvez convertir une
QSharedPointer<QFile>
à unQSharedPointer<QIODevice>
, donc vous pouvez l'utiliser si vous en avez besoin le type de base.mais comme, n'est pas le but d'un pointeur partagé à utiliser quand u ont de multiples propriétaires? l'objet que je crée dans la fin sera la propriétaire, personne d'autre. et ne peux pas j'ai juste utilisé le scopedpointer lors de la création de l'objet pour gérer les exceptions, alors usage de son pointeur brut, puis le stocker à la propriétaire quand tout est terminé?
OriginalL'auteur Attila