Seite 1 von 1

[SOLVED] undefined reference to....

Verfasst: 11. April 2007 10:40
von Wolle
Hallo!

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();
}
Eine (von MEHREREN) von GL_VERTEX abgeleiteten Klassen sieht so aus:

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);
}
Das Resultat sieht so aus:
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
Die GL_VERTEX template Klasse und glTriangelVertex befinden sich in 2 verschiedenen dateien und der header ist natürlich eingebunden ^^

Das ist meine erste (nach ein paar einfachen versuchen) Erfahrung mit templates... was ist da falsch? Oder ist das Konzept schon schlect? :o)

THX!

Verfasst: 11. April 2007 12:14
von upsala
Du hast nicht die Header vergessen, sondern die Library wird nicht gelinkt...

Verfasst: 11. April 2007 12:17
von Wolle
Welche library :?: Muss ich alle templates als lib bauen?

Verfasst: 11. April 2007 12:57
von upsala
Achso hab nur die Hälfte gelesen... Schreib den gesamten Code für dein Template in die Header-Datei.

Verfasst: 11. April 2007 13:08
von Wolle
Ah... geht (fast)! Fanke erstmal soweit ^^
Aber nun taucht ein neuer Fehler auf:
src/graphvertex.h:26: Fehler: es kann kein Objekt des abstrakten Typs »glTriangleVertex« belegt werden


Dieser lässt sich wohl auf diese Zeile im template-Konstruktor zurückführen:

Code: Alles auswählen

T *sideItem = new T(GLScene->side, z, y, x, false);
Warum geht das nicht?! Wenn das gegen die Regeln verstößt habe ich ein mittelschweres design-problem in meinem programm :( . Gibts dafür in diesem Forum auch eine Lösung, obwohl es hierbei wohl um reines C++ geht?

Verfasst: 11. April 2007 13:21
von Wolle
Da hab ich wohl zu vorschnell gepostet! Geht alles ganz hervorragend! *euphorisch bin*

Vielen herzlichen Dank upsala! :D :D