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



  • 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.



  • SeppJ schrieb:

    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.

    Hehe. Soweit (resp. so kurz) habe ich gar nicht mal mehr gedacht. ^^

    @GrinzPrinz
    Unter Windows würde ich dir Visual Studio 2010 Express empfehlen (als Student kannst du auch die Vollversion gratis beziehen). Da musst du dich um so Sachen, wie Linking auch nicht mehr kümmern.

    Ansonsten musst du wahrscheinlich ein Makefile anpassen (oder etwas DevC++ spezifisches).



  • Jo, in VS2010 hab ich den ersten Versuch gemacht...auch da bekomme ich vermutlich die gleiche Fehlermeldung:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Auto::~Auto(void)" (??1Auto@@QAE@XZ)" in Funktion "_wmain". H:\FH\6.Sem\C++\Labor\Labor 3\Labor3_3\Labor3_3\Labor3_3.obj Labor3_3

    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Auto::Auto(void)" (??0Auto@@QAE@XZ)" in Funktion "_wmain". H:\FH\6.Sem\C++\Labor\Labor 3\Labor3_3\Labor3_3\Labor3_3.obj Labor3_3

    Die Codefiles sind exakt dieselben, wie oben gepostet...



  • In deiner Headerdatei hast du keine Codeguards.

    Ich gehe davon aus das du die Projektherstellung im DEV falsch bedienst 😡

    Headerdateien in selbsterstellten Headern nur includieren, wenn die da benötigt werden.
    Also:

    #include <iostream>
    
    using namespace std;
    

    ist bei dir in der falschen Datei gelandet.

    Hau in die Tasten
    f.-th.



  • Ich tippe mal hier so eine Kurzanleitung für eine Projekterstellung.

    Alle deine Quelldateien sind in einem Verzeichnis?

    IDE starten - im Menu "new projekt" oder ähnliches suchen und drauf die Maus -
    dann sollte ein Feld mit mehreren Icons aufgehen - da in deinem Fall "Console Applikation" oder so - eventuell werden noch Pfade/Path/Verzeichnisse abgefragt, die du richtig beantworten solltest - bei einigen IDE ist eine main.cpp vergegeben -> löschen und dann deine .cpp Dateinen mit Pfad richtig eintragen.

    Das nur allgemein.

    Und wie schon zuvor geschrieben:
    Header in der besseren Datei includieren und dann sollte dein Quelltext laufen.

    Wenn nicht, hast du dein Projekt nicht korrekt erstellt.

    MfG f.-th.



  • So, ich nochmal 😉 Hab einen kleinen Spaziergang eingelegt, konnte etwas Abstand von dem Sch*** gewinnen und siehe da, ich hab die Lösung gefunden 🙂

    Man darf in VS2010 eben nicht einfach "Datei"->"Neu" machen, sondern Rechtsklick aufs Projekt und "Hinzufügen"->"Klasse" und schwups läuft alles...Arrrrgggg... 🙄

    Trotzdem Danke an alle für die Hinweise und Antworten 🙂

    Liebe Grüße, der nun glückliche GrinzPrinz 🙂



  • EOutOfResources schrieb:

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

    Was ein Käse. Schonmal was von Compilezeit-Abhängigkeiten gehört? Die Ideale #include-Verteilung ist die, wo der Header mit einer Handvoll Forward-Declarations auskommt und nur die Source alles includiert, was zur Implementierng nötig ist.

    Siehe auch hier:
    http://www.gotw.ca/gotw/007.htm


Anmelden zum Antworten