"...undefined reference to `vtable for ... " - wo liegt der Fehler...



  • Hi 🙂

    hab ein Problem bei meinem Programm. Seit ich mit Hilfe eines "verschachtelten" Vectors ein dynamisches 2D-Array in eine Klasse eingebaut habe, kommt der Fehler

    fx_explosion.o(.text+0x1f): In function `FX_Explosion::FX_Explosion[not-in-charge](int, int, unsigned)': 
    /usr/include/c++/3.2.2/bits/stl_algobase.h:427: undefined reference to `vtable for FX_Explosion' 
    fx_explosion.o(.text+0x4d): In function `FX_Explosion::FX_Explosion[in-charge](int, int, unsigned)': 
    /usr/include/c++/3.2.2/bits/stl_vector.h:894: undefined reference to `vtable for FX_Explosion' 
    collect2: ld returned 1 exit status
    

    (GCC 3.2.2)

    Hier ein kleiner Auszug aus dem Code:

    - Die Basisklasse, in der der Vector steckt:

    class FX_Base
    {
        public:
            FX_Base(int x, int y);
            virtual ~FX_Base();
            virtual void draw(SDL_Surface* surface) = 0;
    
        protected:
            int m_CoorX;
            int m_CoorY;
            vector< vector<SinglePixel> > layers;
    };
    

    und in einer davon abgeleiteten Klasse, FX_Explosion, tritt dann der Fehler auf... 😞

    Wem's hilft, hier der Ctor von FX_Explosion, in dem ja anscheinend der Fehler liegt:

    FX_Explosion::FX_Explosion(int center_x, int center_y, Uint32 color)
                 : FX_Base(center_x, center_y),
                   m_color(color)
    {
        add_new_pixel_layer(1000000); // add lotsa' pixel in the first wave
    }
    


  • Schau mal hier:
    Wegen Konstruktor cpp-File anlegen?

    Dort habe ich etwas dazu geschrieben.



  • hmm... sowohl FX_Base als auch FX_Explosion haben eine .cpp-Datei, wobei die von FX_Base nur aus dem Ctor mit Initialisierungsliste besteht....

    hab auch die alten .o - Dateien geloescht, damit die auch sicher neu erstellt werden, hat aber auch nix gebracht. 😕



  • wobei die von FX_Base nur aus dem Ctor mit Initialisierungsliste besteht....

    Das ist aber doch genau der springende Punkt. Versuch mal in die cpp-Dateien eine *Implementation* mindestens einer virtuellen Methode zu packen. Damit sollte sich dein Problem erledigen.



  • so, jetzt ist der Dtor der Basisklasse auch in der .cpp - Datei, kommt aber immer noch die gleiche Fehlermeldung 😞 Liegt das vielleicht daran dass der Dtor absolut leer ist?

    FX_Base::~FX_Base()
    {
    }
    

    ansonsten hab ich keine virtuellen Funktionen mehr, ausser draw(), aber es macht keinen Sinn, die Methode zu implementieren....

    EDIT: auch wenn der Dtor Code enthaelt, bekomm ich noch die selben Fehler:

    FX_Base::~FX_Base()
    {
        for (unsigned int i = 0; i < layers.size(); ++i)
        {
            layers[i].clear();
        }
        layers.clear();
    }
    

    [ Dieser Beitrag wurde am 16.06.2003 um 14:09 Uhr von Blue-Tiger editiert. ]



  • Hallo,
    also irgendwie kann ich dir nicht folgen. Da steht doch, dass er die vtable der Klasse FX_Explosion nicht finden kann. Warum konzentrierst du dich dann auf die Basisklasse FX_Base ?

    Hast du auch für die Klasse FX_Explosion eine *Definition* einer *virtuellen* Methode in einer cpp-Datei?


Anmelden zum Antworten