Abstrakte Klasse und undefined reference to `vtable

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
DerSofti
Beiträge: 3
Registriert: 18. September 2016 15:20

Abstrakte Klasse und undefined reference to `vtable

Beitrag von DerSofti » 24. September 2016 10:05

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?

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Abstrakte Klasse und undefined reference to `vtable

Beitrag von Christian81 » 24. September 2016 12:13

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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Antworten