error LNK2019



  • Hi,
    ich hab ein Problem mit meiner C++ Übung und komme gerade überhaupt nicht weiter. Es geht um ein Programm mit dem wir Vererbung/Klassen üben sollen. Es gibt 3 Headerdateien, 3 .cpp dateien und eine main.cpp. Ich hab schon einen haufen Fehler gefunden, aber den Fehler LNK2019 kann ich nicht beheben.
    Hier ist die Fehlerliste für die ersten zwei der drei Header und .cpp Dateien:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::Sparschwein(float)" (??0Sparschwein@@QAE@M@Z)" in Funktion "_main". C:\Users\\Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung
    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::~Sparschwein(void)" (??1Sparschwein@@QAE@XZ)" in Funktion "_main". C:\Users\
    \Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung

    Hier ist der Header "Sparschwein.h"

    #ifndef SPARSCHWEIN_H
    #define SPARSCHWEIN_H
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Sparschwein{
    protected:
    	float guthaben;
    
    public:
    	Sparschwein (float guthaben = 0);
    	~Sparschwein();
    	int einwerfen(float in);
    	int printGuthaben();
    
    };
    #endif
    

    Sparschwein.cpp:

    #include "Sparschwein.h"
    
    int Sparschwein::einwerfen(float in){
    
    	guthaben = guthaben + in;
    	cout << "Ihr Guthaben beträgt nun: " << guthaben;
    	return 0;
    	};
    
    int Sparschwein::printGuthaben(){
    	cout << "Ihr Guthaben beträgt: "<< guthaben;
    
    	return 0;
    };
    

    und die Kontrolle.cpp mit der main Funktion:

    #include "Sparschwein.h"
    #include "BuntesSparschwein.h"
    #include "SprechendesSparschwein.h"
    
    int main(){
    
    Sparschwein s1(1.0f);
    //BuntesSparschwein s2(2.0f, 35 ,35 ,35) ;
    //SprechendesSparschwein s3(3.0f, " May the force be with you ");
    
     cout << " ---- Schwein 1 ----" << endl ;
     s1.einwerfen(5.0f);
     s1.printGuthaben();
     cout << " ---- Schwein 2 ----" << endl ;
    //s2. printColor ();
     cout << " ---- Schwein 3 ----" << endl ;
    //s3. einwerfen (10.0f);
    //s3. sprich ();
    
    /*
    Sparschwein s4;
    
    cout << "---- Schweineaddition ----" << endl ;
    s4 = s1 + s2;
    s1. printGuthaben ();
    s2. printGuthaben ();
    s4. printGuthaben ();
    */
    
    system (" PAUSE ");
    return 0;
    }
    

    Die anderen 4 Dateien hab ich mal rausgelassen, die Fehlermeldungen sind die gleichen, es kommen also 4 fast gleiche dazu. Hab nach einer Stunde googeln und rumprobieren noch keine Lösung gefunden die auf mein Problem passt...
    Danke schonmal für die Hilfe!!
    Grüße Flo



  • Du hast den Konstruktor und Destruktor deiner Klasse Sparschwein nirgendwo definiert...

    Schauen wir uns die Fehlermeldung mal genau an:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::Sparschwein(float)" (??0Sparschwein@@QAE@M@Z)" in Funktion "_main". C:\Users\\Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung
    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::~Sparschwein(void)" (??1Sparschwein@@QAE@XZ)" in Funktion "_main". C:\Users\
    \Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung

    Der Linker sagt, dass Sparschwein::Sparschwein(float) und Sparschwein::~Sparschwein(void) zwar in deinem Programm referenziert (verwendet) werden, er aber nirgendwo eine Definition dieser Symbole finden kann.

    Btw: Ich würde schwer empfehlen, mit der englischen Version von Visual Studio zu arbeiten. Englische Compilerfehlermeldungen werden bei google potentiell wesentlich mehr Information zu Tage fördern... 😉



  • Floxv3 schrieb:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::Sparschwein(float)" (??0Sparschwein@@QAE@M@Z)" in Funktion "_main". C:\Users\\Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung
    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Sparschwein::~Sparschwein(void)" (??1Sparschwein@@QAE@XZ)" in Funktion "_main". C:\Users\
    \Documents\Visual Studio 2012\Projects\Vererbung\Vererbung\Kontrolle.obj Vererbung

    Du hast einen Konstruktor Sparschwein(float) deklariert und verwendet, aber nicht implementiert.
    Das gleiche gibt für den Destruktor von Sparschwein.

    Sparschwein.cpp:

    #include "Sparschwein.h"
    
    int Sparschwein::einwerfen(float in){
    
    	guthaben = guthaben + in;
    	cout << "Ihr Guthaben beträgt nun: " << guthaben;
    	return 0;
    	};
    
    int Sparschwein::printGuthaben(){
    	cout << "Ihr Guthaben beträgt: "<< guthaben;
    
    	return 0;
    };
    

    Jau, fehlen beide.

    HTH

    Übrigens gehören nach Funktionsdefinitionen keine Semikolons.



  • dot schrieb:

    Btw: Ich würde schwer empfehlen, mit der englischen Version von Visual Studio zu arbeiten. Englische Compilerfehlermeldungen werden bei google potentiell wesentlich mehr Information zu Tage fördern... 😉

    Ich google immer noch dem Fehler, also in dem Fall nach "visual c++ lnk2019". Da kommt man auch auf die Microsoft Hilfe Seiten und die sind echt gut. 🙂



  • Ich muss den Konstruktor und Destrukor also in den jeweiligen .cpp dateien noch implementieren?
    Wie genau muss ich Sparschwein den implementieren? Wenn ich einfach

    Sparschwein(guthaben)
    

    benutze bekomme ich eine neue Fehlermeldung...

    Edit: Danke übrigens schonmal für die vielen und schnellen Antworten



  • Naja, z.B. so:

    Sparschwein::Sparschwein(float g)
      : guthaben(g)
    {
    }
    
    Sparschwein::~Sparschwein()
    {
    }
    

    Btw: Wieso ist guthaben eigentlich protected?



  • Floxv3 schrieb:

    Ich muss den Konstruktor und Destrukor also in den jeweiligen .cpp dateien noch implementieren?

    Entweder das, ja, oder als inline-Definition, also innerhalb der Klasse im Header.

    Floxv3 schrieb:

    Wie genau muss ich Sparschwein den implementieren?

    Wurde doch schon gesagt.

    Floxv3 schrieb:

    Wenn ich einfach

    Sparschwein(guthaben)
    

    benutze bekomme ich eine neue Fehlermeldung...

    Ach, du meinst die Verwendung (nicht die Implementierung) der Klasse?

    Na, so:

    int main()
    {
       Sparschwein meine_ersparnisse (123);
       return 0;
    }
    

    BTW: Deklaration und Definition des Destruktors ist hier auch überflüssig.



  • dot schrieb:

    Btw: Wieso ist guthaben eigentlich protected?

    In der Aufgabenstellung war vorgegeben, dass Membervariablen protected/private seien sollen.

    dot schrieb:

    Naja, z.B. so:

    Sparschwein::Sparschwein(float g)
      : guthaben(g)
    {
    }
    
    Sparschwein::~Sparschwein()
    {
    }
    

    Wofür ist die Zeile

    : guthaben(g)
    

    da? Dient das zur Vererbung?



  • Floxv3 schrieb:

    dot schrieb:

    Btw: Wieso ist guthaben eigentlich protected?

    In der Aufgabenstellung war vorgegeben, dass Membervariablen protected/private seien sollen.

    Und wieso genau hast du es protected gemacht anstatt z.B. private? 😉

    Floxv3 schrieb:

    Wofür ist die Zeile

    : guthaben(g)
    

    da? Dient das zur Vererbung?

    Das ist die sog. Initialisierungsliste des Konstruktors. Die dient dazu, Member zu initialisieren. Im konkreten Beispiel wird dort natürlich einfach nur der Member guthaben mit dem entsprechenden Wert initialisiert.



  • dot schrieb:

    Floxv3 schrieb:

    dot schrieb:

    Btw: Wieso ist guthaben eigentlich protected?

    In der Aufgabenstellung war vorgegeben, dass Membervariablen protected/private seien sollen.

    Und wieso genau hast du es protected gemacht anstatt z.B. private? 😉

    Hab beides versucht und es macht keinen Unterschied. Ich dachte Protected ist vielleicht besser beim vererben an die anderen Klassen.
    Danke für die Erklärung, konnt mir den code für die restlichen Klassen relativ gut herleiten.



  • ich habe nen problem mit cpp dateien sprechendesSparschwein und buntes sparschwein könntest du die eventuell hier zeigen ?

    viel dank


Anmelden zum Antworten