2010-11-25 6 views
0

Je voulais créer un vecteur d'une sous-classe de QGraphicsRectItem, nommé MyRect. Ce vecteur est initialisé dans MyClass:QT éléments dans l'initialisation de vecteur. Comment résoudre un problème de constructeur de copie privée?

MyClass::MyClass() : myVector_(80, std::vector<MyRect>(60, MyRect(true,true))) 
... 

J'ai appris que vecteur construit le premier élément, puis recopié avec le constructeur de copie. Le problème est que le constructeur de copie de QGraphicsRectItem est privé et cela ne fonctionne pas. (Très long message d'erreur, une heure de googler)

Maintenant, j'ai trois solutions possibles que je le vois:

1.) Faire une boucle for et remplir moi-même dans myVector le corps du constructeur.

1b.) Utilisez simplement un tableau normal car il reste statique de toute façon.

2.) Utiliser MyRect * au lieu de MyRect en tant que contenu de myVector (allocation de mémoire manuelle -> mauvais)

3.) Utiliser QVector qui utilise * objet par défaut et gère la mémoire pour moi.

Après avoir passé au moins une heure sur la résolution de ce que je voudrais vous entendre s'il y a d'autres bonnes possibilités ou ce que vous pensez est la meilleure solution . Je suis sur le point de laisser tomber des vecteurs pour cela et juste en utilisant des tableaux.

Répondre

2

Le vecteur, comme vous l'avez déclaré, devra manipuler des instances de MyRect. Cela signifie qu'en fonction de ce que vous faites avec les éléments du vecteur, ou si vous copiez le vecteur, les instances MyRect peuvent être dupliquées.

Cela n'est pas possible, car cela signifierait la création d'un nouvel élément chaque fois qu'une copie se produit (c'est pourquoi le constructeur QGraphicsItem est privé). Vous devez manipuler les éléments de votre scène à travers un pointeur.

Ainsi, pour moi, la meilleure solution est de stocker dans vos pointeurs de vecteur sur vos articles (votre 2ème solution):

std::vector<MyRect*> 

Gestion de la mémoire ne doit pas être un problème du tout, car cela sera traité par Qt: lorsque vous détruisez la scène, tous les éléments de cette scène seront détruits.

Votre vecteur ne dupliquera pas d'éléments (pas d'instanciation), seulement des pointeurs, ce qui signifie que vous ne créerez pas de nouveaux objets que vous devrez détruire vous-même.

Questions connexes