[Linker error] undefined reference to `Auto::Auto()'



  • Moin,moin.

    Brauche dringend Hilfe, bin hier quasi am verzweifeln... Habe folgende Datein (alle im gleichen Ordner):

    Auto.h

    class Auto {
    
    private:
    	int leistung;
    	char* fabrikat;
    	static int anzahl;
    
    public:
    	Auto();
    	Auto(int leistung, char* fabrikat);
    	~Auto();
    
    	int getLeistung();
    	char* getFabrikat();
    
    	void setLeistung(int leistung);
    	void setFabrikat(char* fabrikat);
    
    	void print();
    
    	static int getAnzahl();
    };
    

    Auto.cpp

    #include "Auto.h"
    #include <iostream>
    
    using namespace std;
    
    Auto() {
    	leistung = 0;
    	fabrikat = "";
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    Auto(int leistung, char* fabrikat) {
    	leistung = leistung;
    	fabrikat = fabrikat;
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    ~Auto() {
    	anzahl--;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    int getLeistung() {
    	return leistung;
    }
    
    char* getFabrikat() {
    	return fabrikat;
    }
    
    setLeistung(int leistung) {
    	leistung = leistung;
    }
    
    setFabrikat(char* fabrikat) {
    	fabrikat = fabrikat;
    }
    
    print() {
    	cout << "Fabrikat: " << fabrikat << " Leistung: " << leistung << endl;
    }
    
    int getAnzahl() {
    	return anzahl;
    }
    }
    

    und Labor3_3.cpp

    #include "Auto.h"
    
    int main(int argc, char* argv[])
    {
    	Auto a;
    	return 0;
    }
    

    Und nun kommt folgender Fehler:
    [Linker error] undefined reference to Auto::Auto()' [Linker error] undefined reference toAuto::~Auto()'

    Was mache ich falsch, wiesoe konnet der den Konstruktor nicht???

    Vielen Dank für jeden Hinweis 🙂

    GrinzPrinz



  • Auto::
    

    fehlt bei der Implementierung.

    z.B

    Auto::Auto() { ...}
    


  • Inkludierungen kommen in den Header. Das Sourcefile inkludiert nichts ausser dem Header.



  • EOutOfResources schrieb:

    Inkludierungen kommen in den Header. Das Sourcefile inkludiert nichts ausser dem Header.

    Was willst du damit jetzt aussagen? Ein Header wird immer von demjenigen eingebunden, der ihn verwenden will.



  • CStoll schrieb:

    ...

    Jaja, das ist schon klar. Ich meinte, dass man standardmässig Dinge wie #include <iostream> in den Header schreibt.



  • Nö!



  • Wieso sollte man? Die Deklaration der Auto-Klasse hat überhaupt keinen Bezug zu IO-Streams, also hat sie es auch nicht nötig, die einzubinden.
    (sowas reduziert auch die Abhängigkeiten - wenn du die <iostream> nur in der Implementierung einbindest, kannst du sie später weglassen oder durch <fstream> ersetzen, wenn du die Debug-Ausgaben weglassen willst)



  • Danke schonmal für die Antworten, jetzt kommt allerdings ein neuer aber ähnlicher Fehler:

    [Linker error] undefined reference to `Auto::anzahl'

    Wahrscheinlich auch simpel zu lösen?!

    Lg GrinzPrinz

    Schön wärs, der Fehler konnte durch "Speichern" behoben werden... 🙄

    Allerdings bleibt es leider bei den erstgenannten Fehlern 😞

    Lg GrinzPrinz



  • Weißt du denn was diese Fehlermeldung bedeutet? Falls ja, müsstest du die Antwort eigentlich nun schon kennen. 😉


  • Mod

    GrinzPrinz schrieb:

    Danke schonmal für die Antworten, jetzt kommt allerdings ein neuer aber ähnlicher Fehler:

    [Linker error] undefined reference to `Auto::anzahl'

    Wahrscheinlich auch simpel zu lösen?!

    Statische Member müssen irgendwo "leben". Am besten machst du das durch ein

    int Auto::anzahl;
    

    in deine Auto.cpp



  • Ich vermute, dass der Linker den Konstruktor der Auto-Klasse nicht findet...weiß nur leider nicht, wie ich "ihm" da weiterhelfen kann... 🙄



  • Die Antwort hatte dir drakon doch gleich als erster gegeben - die Methodendefinitionen einer Klasse mußt du mit dem Klassennamen kennzeichnen:

    Auto::Auto()
    {
      ...
    }
    

    (bei den anderen Methoden genauso)



  • hab ich doch 😮 oder nicht???

    Auto.cpp

    #include "Auto.h"
    
    int Auto::anzahl;
    
    Auto::Auto() {
    	leistung = 0;
    	fabrikat = "";
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    Auto::Auto(int leistung, char* fabrikat) {
    	leistung = leistung;
    	fabrikat = fabrikat;
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    Auto::~Auto() {
    	anzahl--;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    int Auto::getLeistung() {
    	return leistung;
    }
    
    char* Auto::getFabrikat() {
    	return fabrikat;
    }
    
    void Auto::setLeistung(int leistung) {
    	leistung = leistung;
    }
    
    void Auto::setFabrikat(char* fabrikat) {
    	fabrikat = fabrikat;
    }
    
    void Auto::print() {
    	cout << "Fabrikat: " << fabrikat << " Leistung: " << leistung << endl;
    }
    
    int Auto::getAnzahl() {
    	return anzahl;
    }
    


  • Jetzt schon, in deinem oberen Beitrag noch nicht 😉

    Was für einen Compiler/IDE verwendest du eigentlich? Wenn du per Kommandozeile übersetzt, mußt du dem Compiler mitteilen, daß er beide Quelldateien zusammenfassen soll (eine IDE kümmert sich normalerweise darum).



  • Hab das jetzt in Dev C++ drin...



  • Zeig nochmal die genaue Fehlermeldung mit dem dazughörenden Code.



  • Labor3_3.cpp

    #include "Auto.h"
    
    int main(int argc, char* argv[])
    {
    	Auto a = Auto::Auto();
        return 0;
    }
    

    Auto.h

    #include <iostream>
    
    using namespace std;
    
    class Auto {
    
    private:
    	int leistung;
    	char* fabrikat;
    	static int anzahl;
    
    public:
    	Auto();
    	Auto(int leistung, char* fabrikat);
    	~Auto();
    
    	int getLeistung();
    	char* getFabrikat();
    
    	void setLeistung(int leistung);
    	void setFabrikat(char* fabrikat);
    
    	void print();
    
    	static int getAnzahl();
    };
    

    Auto.cpp

    #include "Auto.h"
    
    int Auto::anzahl;
    
    Auto::Auto() {
    	leistung = 0;
    	fabrikat = "";
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    Auto::Auto(int leistung, char* fabrikat) {
    	leistung = leistung;
    	fabrikat = fabrikat;
    	anzahl++;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    Auto::~Auto() {
    	anzahl--;
    	cout << "Anzahl vorhandener Autos: " << getAnzahl() << endl;
    }
    
    int Auto::getLeistung() {
    	return leistung;
    }
    
    char* Auto::getFabrikat() {
    	return fabrikat;
    }
    
    void Auto::setLeistung(int leistung) {
    	leistung = leistung;
    }
    
    void Auto::setFabrikat(char* fabrikat) {
    	fabrikat = fabrikat;
    }
    
    void Auto::print() {
    	cout << "Fabrikat: " << fabrikat << " Leistung: " << leistung << endl;
    }
    
    int Auto::getAnzahl() {
    	return anzahl;
    }
    

    Und die Fehler:
    [Linker error] undefined reference to Auto::Auto()' [Linker error] undefined reference toAuto::~Auto()'



  • Bereinige mal das Projekt und erstell alles neu. Das sollte so eigentlich gehen.

    Abgesehen davon solltest du dir mal Headerguards anschauen und using namespace im Header zu haben ist keine gute Idee.



  • Auch das Projekt bereinigen nütze leider nichts 😞

    Ob das nun alles guter programmierstil is, sei mal dahin gestellt...im mom zählt für mich nur, dass es läuft... 😉

    Lg GrinzPrinz


  • Mod

    Das sieht mir sehr danach aus, als würdest du die aus Auto.cpp erzeugte Objektdatei nicht dazu linken. Wie man das in DevC++ macht: Keine Ahnung.


Anmelden zum Antworten