Seite 1 von 1

Abstrakte Klasse und undefined reference to `vtable

Verfasst: 24. September 2016 10:05
von DerSofti
Aktuell bin ich mit dem Buch von Bjarne Stroustrup zu C++ 11 beschäftigt und gerade beim Kapitel 20.4 zum Thema abstrakte Klassen.
Da das ganze ja C++ nach dem ISO-Standard ist, ging ich davon aus, daß das von QT-Creator unterstützt wird, dem ist aber leider nicht so.
Weil im Buch auch nur die Konsole von Bjarne Stroustrup verwendet wird, habe ich als Projekt ebenfalls eine reine C++ Anwendung ausgewählt.
Hier der Beweis

Inhalt der Projektdatei:

Code: Alles auswählen

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp \
    shape.cpp

HEADERS += \
    shape.h
C++11 ist eingestellt, scheint aber ein Pseudo C++ von QT zu sein, also nicht ISO-Standard.

Die Main:

Code: Alles auswählen

#include <iostream>
#include <shape.h>

using namespace std;


int main(int argc, char *argv[])
{
    Circle *Kreis = new Circle(5, 5);

    return 0;
}
Header von Shape:

Code: Alles auswählen

#ifndef SHAPE_H
#define SHAPE_H


class Shape {
public:
    virtual void rotate(int) = 0;
    virtual void draw() const = 0;
    virtual bool is_closed() const = 0;

    virtual ~Shape();
};

class Circle : public Shape {
public:
    Circle(int p, int r);
    void rotate(int)  { }
    void draw() const ;
    bool is_closed() const { return true; }
private:
    int point, radius;
};

#endif // SHAPE_H
Definition von Shape:

Code: Alles auswählen

#include "shape.h"

Circle::Circle(int p, int r) {
    point = p;
    radius = r;
}
Der Konstruktor von Circle ist momentan das einzige was ich implementiert habe, nachdem ich alles von Shape und Circle in seperate Header und C++ Dateien getrennt gepackt habe, weil das in einem englisch-sprachigen QT-Forum so empfohlen wurde. Zwar weicht das ganze dann noch mehr vom Buchbeispiel ab und ist auch unübersichtlicher, aber damit kann ich leben.
Trotz alledem kommen immernoch diese lästige Fehlermeldungen:
undefined reference to `Circle::Circle(int, int)'
undefined reference to `vtable for Shape'

Bereinigen und QMake alleine ausführen habe ich auch schon gemacht, da kam kein Fehler bei QMake, aber dann beim entscheidenen Erstellen bzw. Ausführen schonwieder undefinded reference to ......

Wie kann ich den QT-Creator dazu bringen, alles korrekt zu erstellen?

Re: Abstrakte Klasse und undefined reference to `vtable

Verfasst: 24. September 2016 12:13
von Christian81
Ich bin mir ziemlich sicher, dass die Fehlermeldung
shape.o: In function `Circle::Circle(int, int)':
shape.cpp:(.text+0x3): undefined reference to `vtable for Circle'
Und das liegt daran, dass Du Circle::draw() nicht implementiert hast und dadurch der Compiler wohl den vtable (Tabelle mit den Adressen zu den virtuellen Funktionen) nicht aufbaut.
Der dtor von Shape ist übrigens auch nur deklariert und nicht implementiert