2010-11-25 7 views
0

Ich wollte einen Vektor einer Unterklasse von QGraphicsRectItem mit dem Namen MyRect erstellen. Dieser Vektor wird in MyClass initialisiert:QT-Elemente bei der Vektorinitialisierung. Wie löst man das Privatkopie-Konstruktor-Problem?

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

erfuhr ich, dass Vektor-Konstrukte das erste Element und kopiert sie dann mit dem Copy-Konstruktor. Das Problem ist, dass der Kopierkonstruktor von QGraphicsRectItem privat ist und dies nicht funktioniert. (Sehr lange Fehlermeldung, eine Stunde googeln)

Jetzt habe ich drei mögliche Lösungen wie ich es sehe:

1.) Machen Sie eine for-Schleife und bevölkern myVector mich im Konstruktor Körper.

1b.) Verwenden Sie nur ein normales Array, da es trotzdem statisch bleibt.

2.) Verwenden MyRect * statt MyRect als Inhalt von myVector (manuelle Speicherzuordnung -> schlecht)

3.) Verwenden QVector die Object * standardmäßig verwendet und verwaltet den Speicher für mich.

Danach mindestens eine Stunde zu verbringen auf die Lösung würde Ich mag, von Ihnen zu hören, wenn es andere gute Möglichkeiten sind oder was Sie denken, ist die beste Lösung . Ich bin kurz davor, Vektoren dafür fallen zu lassen und nur Arrays zu verwenden.

Antwort

2

Der Vektor muss, wie Sie es deklariert haben, Instanzen von MyRect bearbeiten. Dies bedeutet, dass abhängig davon, was Sie mit den Elementen des Vektors tun, oder wenn Sie den Vektor kopieren, die MyRect Instanzen dupliziert werden können.

Dies ist nicht möglich, da dies bedeuten würde, jedes Mal, wenn eine Kopie auftritt, ein neues Element zu erstellen (deshalb ist der Konstruktor QGraphicsItem privat). Sie haben manipulieren Sie die Elemente Ihrer Szene durch einen Zeiger.

mir also die beste Lösung ist in Ihrem Vektor Zeiger auf Ihre Artikel (Ihre zweite Lösung) zu speichern:

std::vector<MyRect*> 

Speicherverwaltung ein Problem überhaupt nicht sein sollte, da dies gehandhabt werden von Qt: Wenn du die Szene zerstörst, werden alle Teile dieser Szene zerstört.

Ihr Vektor wird Objekte nicht duplizieren (keine Instanziierung), nur Zeiger, was bedeutet, dass Sie keine neuen Objekte erstellen, die Sie selbst zerstören müssten.