2015-03-17 2 views
2

Existe-t-il un conteneur Qt, qui est conscient du signal détruit de QObject et supprime l'élément si un élément a été détruit?Conteneur QObject selfdestruction aware

I.e. comme ceci:

QObject *obj1 = new MyObject(); 
QObject *obj2 = new MyObject(); 
QObjectContainer c; 
c.add(obj1); 
c.add(obj2); 
qDebug() << c.size(); // Prints 2 
delete obj1; 
qDebug() << c.size(); // Prints 1 
+0

Attendez, vous avez un défaut dans votre idée. Si vous supprimez un objet, comment trouveriez-vous son index dans le tableau? Vous devez effectuer une recherche complète à chaque fois. Pensez-y, il ne peut pas être mis en œuvre de manière raisonnable. Même si votre tableau attrape le signal 'destroyed()', il obtient seulement l'adresse du pointeur, pas son index dans le tableau. Vous devrez le rechercher en valeur. La performance serait horrible. – sashoalm

+0

Ajoutez vos objets en tant qu'enfants d'un QObject parent fictif ;-) – peppe

Répondre

1

Vous pouvez le faire vous-même en attraper le signal destroyed() intérieur container classe dérivée de.

P.S. Aucune classe Qt fait cela, AFAIK.

0

QPointer sera automatiquement clair lui-même lorsque l'objet pointé est supprimé

+0

Eh bien c'est un bon bit il y a une liste qui supprimera le QPointer si l'objet contenu pointé est supprimé. – ManuelSchneid3r

+0

@ ManuelSchneid3r vous pouvez faire un peu de comptabilité pendant l'itération, bien qu'une liste indexée ne soit probablement pas une bonne idée à la place un conteneur semblable à un ensemble serait meilleur. –