[erledigt] virtual und vererbung



  • Hallo,

    ich versuche eine Datei in Haeder und Body aufzuteilen.

    Ich hab ein Interface und eine View Klasse, die von dem Interface erbt.

    Interface:

    //Beobachter.hpp
    
    #ifndef BEOBACHTER_HPP
    #define BEOBACHTER_HPP
    
    class Beobachter
    {
    	public:
    		virtual void update() = 0;
    };
    
    #endif
    

    View:

    //View.hpp
    
    #ifndef VIEW_HPP
    #define VIEW_HPP
    
    #include "Beobachter.hpp"
    
    class View : public Beobachter
    {
    	public:
    		View();
    		void update();
    };
    
    #endif
    

    Wenn ich nun versuche in der Body Datei (cpp)

    //View.cpp
    
    #include "View.hpp"
    
    View::View() : Beobachter() {} // Aufruf der Base Klass
    

    bekomme ich Linkfehler:

    View.o: In function View::View()': View.cpp:(.text+0x8): undefined reference tovtable for View'
    View.o: In function View::View()': View.cpp:(.text+0x18): undefined reference tovtable for View'
    collect2: ld returned 1 exit status
    make: *** [first] Error 1

    Wenn ich den Code in die Haeder Datei schreibe, dann geht es, aber so sollte es nicht sein.
    Andere View.hpp

    //View.hpp
    
    #ifndef VIEW_HPP
    #define VIEW_HPP
    
    #include "Beobachter.hpp"
    
    class View : public Beobachter
    {
    	public:
    		View() : Beobachter(); // Hier der Aufruf der Base Klass
    		void update();
    };
    
    #endif
    

    Wie kann ich die Linkfehler wegbekommen mit dem Code in der cpp Datei?

    Gruß



  • http://gcc.gnu.org/faq.html#vtables
    Ich hab zwar noch ein bisschen Verständnisschwierigkeiten, aber es scheint ja an den Übersetzungseinheiten zu liegen, da deine zweite Lösung funktioniert.



  • wie sollte der compiler eine vtable für View machen können, wenn du die funktion update nirgends definierst? immerhin muss in die vtable deren adresse hinein.



  • Übersetzt du View.cpp überhaupt?



  • Vielen Dank 🙂

    ich wusste, dass ich die update Funktion schreiben muss, aber der Fehler hat nicht direkt auf sie verwiesen, deshalb war ich verwirrt und versuchte erstmal den Fehler zu beseitigen.

    Also nachdem ich die update Funktion implementiert habe, kompiliert er ohne Probleme.

    Danke...


Anmelden zum Antworten