Fehlermeldung "error LNK2001: Nicht aufgelöstes externes Symbol" bei Verwendung einer Virtual-Methode



  • Hallo Community,

    leider habe ich beim Programmieren mit Visual Studio 2010 die folgende Fehlermeldung bekommen:

    Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall CArtikel::AusgabeArtikel(double)" (?AusgabeArtikel@CArtikel@@UAEXN@Z)"

    Das geschriebene Programm enthält eine virtuelle Methode, welche durch die späte Bindung bei den Artikeln zwischen Stück- und Gewichtsartikeln entscheiden soll. Beide Artikelarten sind vererbte Klassen der Klasse CArtikel. Leider habe ich keine Ahnung, warum der genannte Fehler auftritt.

    Über eure Hilfe würde ich mich sehr freuen,

    orPoG



  • Edit: Die Funktionen sind beide Definiert und der entsprechenden Klasse zugeordnet, daran kann es also meines Wissens nach nicht scheitern.



  • Gibt es auch eine Implementierung von CArtikel::AusgabeArtikel(double) ? Oder wenn man gar keine Objekte von CArtikel anlegen soll weil es nur ein Interface ist dann musst du die Funktion als pure virtual definieren. Ein compilierbares Beispiel mit dem gleichen Fehler wäre jedenfalls hilfreich.



  • Dir fehlt die Funktion der Basiklasse CArtikel! Hast du vergessen, sie abstrakt zu machen?

    So eine Frage ohne Code ist ziemlich sinnlos!



  • manni66 schrieb:

    Dir fehlt die Funktion der Basiklasse CArtikel! Hast du vergessen, sie abstrakt zu machen?

    So eine Frage ohne Code ist ziemlich sinnlos!

    Genau das ist es, danke für den Tipp 😉

    Leider weiß ich jetzt nur nicht, was ich überhaupt schreiben soll in der Datei "CArtikel.cpp".

    #include "StdAfx.h"
    #include "Artikel.h"
    
    //Konstruktoren
    CArtikel::CArtikel(void)
    {
    }
    
    CArtikel::~CArtikel(void)
    {
    }
    
    CArtikel::CArtikel(char* lArtikelbezeichnung,int lArtikelnummer)
    {
    	strcpy(artikelbezeichnung, lArtikelbezeichnung);
    	artikelnummer = lArtikelnummer;
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // Lesefunktionen
    int CArtikel::ArtikelnummerLesen(void)
    	{return artikelnummer;}
    int CArtikel::StueckartikelLesen(void)
    	{return stueckartikel;}
    int CArtikel::GewichtsartikelLesen(void)
    	{return gewichtsartikel;}
    char* CArtikel::ArtikelbezeichnungLesen(void)
    	{return artikelbezeichnung;}
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    virtual void CArtikel::AusgabeArtikel(double Faktor)
    {
     Hier meckert er bereits bei dem "virtual" rum
    }
    
    //virtual double AusgabeArtikelP(double Faktor)
    //{
    //
    //}
    


  • Mit folgendem Code rufe ich die Funktion "Ausgabe Artikel" auf:

    void CBestellung::AusgabeArtikelAufruf(CArtikel &x, double Faktor)
    {
    	x.AusgabeArtikel(Faktor); 
    }
    


  • orPoG schrieb:

    virtual void CArtikel::AusgabeArtikel(double Faktor)
    {
     Hier meckert er bereits bei dem "virtual" rum
    }
    

    Das virtual gehört ja auch nur an die Deklaration der Funktion.



  • Okay, danke 🙂

    Was muss ich denn dann dort definieren? Er soll ja eigentlich gar nichts in der Klasse CArtikel machen, sondern direkt in die Klassen GewichtsArtikel oder StueckArtikel springen. Dort habe ich die Funktionen auch definiert. Was genau muss ich denn in der Klasse CArtikel definieren?



  • Im Header in der Klasse CArtikel:

    virtual void AusgabeArtikel(double Faktor) = 0;
    

    Im cpp:
    nichts!



  • Perfekt, das "=0" hatte mir gefehlt. Jetzt kompiliert es.

    Zwar tut es nicht das, was das Programm soll, aber das ist ja eine andere Sache. Das es überhaupt kompiliert ist schon mal super. Dankeschön für die Hilfe!


Anmelden zum Antworten