Das Problem: Eine von QGraphicsItem abgeleitete Klasse erstellt in ihrem Konstructor Instanzen von sich selbst (this->r = new MyGraphicsItem). Um Items, die sich identisch verhalten, aber anders aussehen zu erhalten, leite ich diese Klasse ab. Jedoch werden jetzt in dem Konstruktor einer weiteren geerbten Klasse (zB MyGraphicsItemEnkel *g*) sondern immernoch die von MyGraphicsItem erstellt!
Lösungversuch: Erstellen einer Template-Klasse die von QGraphicsItem (QGraphicsItem ist nötig da auch schöne sachen wie ItemChange() behandelt werden sollen) abgeleitet ist:
Code: Alles auswählen
template<class T> class GL_VERTEX : public QGraphicsItem
{
public:
GL_VERTEX(glScene*, int, int, int, bool init = true);
/*protected:
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
*/
private:
T *r;
T *l;
};
template<class T> GL_VERTEX<T>::GL_VERTEX(glScene *GLScene, int x, int
y, int z, bool init)
{
setPos(QPointF(x, y));
setZValue(z);
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
GLScene->addItem(this);
if(init)
{
T *sideItem = new T(GLScene->side, z, y, x, false);
T *topItem = new T(GLScene->top, x, z, y, false);
this->r = sideItem;
this->l = topItem;
sideItem->r = topItem;
sideItem->l = this;
topItem->r = this;
topItem->l = sideItem;
}
GLScene->update();
}Code: Alles auswählen
class glTriangleVertex : public GL_VERTEX<glTriangleVertex>
{
public:
glTriangleVertex(glScene*, glTriangle*, int, int, int, bool init = true);
/*protected:
QRectF boundingRect() const;
void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);
*/
private:
glTriangle *object;
};
glTriangleVertex::glTriangleVertex(glScene *scene, glTriangle *object, int x, int y, int z, bool init) : GL_VERTEX<glTriangleVertex>::GL_VERTEX(scene, x, y, z, init)
{
this->object = object;
scene->triangles.append(this);
}
Die GL_VERTEX template Klasse und glTriangelVertex befinden sich in 2 verschiedenen dateien und der header ist natürlich eingebunden ^^tmp/build/triangle.o: In function `glTriangleVertex::glTriangleVertex(glScene*, glTriangle*, int, int, int, bool)':
triangle.cpp:(.text+0x5d): undefined reference to `GL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
tmp/build/triangle.o: In function `glTriangleVertex::glTriangleVertex(glScene*, glTriangle*, int, int, int, bool)':
triangle.cpp:(.text+0xdd): undefined reference to `GL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
collect2: ld gab 1 als Ende-Status zurück
make: *** [conceptED] Fehler 1
Das ist meine erste (nach ein paar einfachen versuchen) Erfahrung mit templates... was ist da falsch? Oder ist das Konzept schon schlect?
THX!