Undefined reference to function



  • Hallo,

    ich bin gerade dabei C++ zu lernen. Jetzt habe ich das Problem das sich mein Programm nicht richtig compilieren lässt und ich immer wieder den selben Fehler in meiner Konsole erhalte.

    undefined reference to `Becher::ausgabe()
    collect2.exe: error: ld returned 1 exit status
    

    Meine Dateien

    helloworld.cpp

    #include <iostream>
    #include "becher.h"
    using namespace std;
    
    int addieren(int x, int y, int sum);
    
    int main()
    {
    
        int sum;
    
        sum = addieren(10, 20, sum);
        
        cout << sum;
    
    
        Becher b;
    
        b.inhalt = "Cola";
        b.fassungsvermoegen = 10;
    
        b.ausgabe();
        
        return 0;
    }
    
    
    int addieren(int x, int y, int sum) 
    {
        return sum = (x * y);
    }
    

    becher.cpp

    #include <iostream>
    #include <string>
    
    class Becher 
    {
    public:
        std::string inhalt;
        int fassungsvermoegen;
    
        void ausgabe(){
            std::cout << inhalt << std::endl;
        }
    
    };
    

    becher.h

    #ifndef BECHER_H
    #define BECHER_H
    
    #include <string>
    
    class Becher 
    {
        public:
        std::string inhalt;
        int fassungsvermoegen;
    
        void ausgabe();
    
    };
    #endif
    

    Meine Konsolen-Eingabe sieht folgendermaßen aus

    g++ helloworld.cpp .\becher.cpp -o hello
    

    Es wäre sehr nett, wenn mir wer weiterhelfen könnte.


  • Mod

    Die class Becher in Becher.cpp sieht zwar so aus wie die in Becher.h, aber im Rahmen des Übersetzungsvorgangs ist das eine völlig unabhangige Klasse, die zufällig den gleichen Namen hat.

    In Becher.cpp:

    #include "Becher.h"
    
    Becher::ausgabe()
    {
            std::cout << inhalt << std::endl;
    }
    


  • Hallo,
    du gehst das falsch an. Du hast in der becher.cpp die ganze Klassendefinition nochmal kopiert, nur dass ausgabe jetzt auch einen Körper hat. Das macht man so nicht.

    In die becher.cpp gehört:

    1. ein #include "becher.h"
    2. eine Definition für die Funktion:
    void Becher::ausgabe() {
      std::cout << inhalt << std::endl;
    }
    
    1. natürlich alles, was man noch so braucht, damit das als eigene Übersetzungseinheit compiliert, also die Includes für <iostream> und <string>.

    Irgendjemand anders wird jetzt wohl erklären, was technisch gesehen an dem was du gemacht hast falsch ist und warum genau diese Fehlermeldung kommt, deshalb lass ich das mal weg 😃



  • Danke für eure Antworten. Meine becher.cpp sieht jetzt so aus.

    #include <iostream>
    #include <string>
    #include "becher.h"
    
    class Becher 
    {
    public:
        std::string inhalt;
        int fassungsvermoegen;
    
        void Becher::ausgabe(){
            std::cout << inhalt << std::endl;
        }
    
    };
    

    Die Fehlermeldung

    .\becher.cpp:5:7: error: redefinition of 'class Becher'
     class Becher
           ^~~~~~
    In file included from .\becher.cpp:3:0:
    .\becher.h:6:7: error: previous definition of 'class Becher'
     class Becher
           ^~~~~~
    

    Mache ich immer noch etwas falsch?



  • Du sollst nur das:
    @Nastypasty sagte in Undefined reference to function:

    void Becher::ausgabe(){
    std::cout << inhalt << std::endl;
    }

    (+ die Includes)
    In deiner becher.cpp haben.
    In deinem Header sagst du, wie deine Klasse aussieht und welche Funktionen bereit gestellt werden, in deiner Source Datei bestimmst du, wie sich die Funktionen verhalten sollen.



  • @Nastypasty sagte in Undefined reference to function:

    Mache ich immer noch etwas falsch?

    Ja. In die cpp-Datei kommt nur die Funktion. class ... steht nur im Header.



  • Der übliche Aufbau sieht so aus:

    SourceFile(.cpp)

    
    #include "myclassheader.h"
    
    // Konstruktor
    MyClass::MyClass()
    {
    }
    
    // Destruktor
    MyClass::~MyClass()
    {
    }
    
    ... weitere Funktionen
    

    und der Header dann so:

    
    
    class MyClass
    {
    public:
        MyClass();
        ~MyClass();
    
    private:
       ...
    
    

    In der Sourcedatei stehen die Implementationen. Aber dafür muss die Grundstruktur bekannt sein, die wiederum im Header (.h) geschrieben steht. Dort stehen dann die sogenannten Deklarationen.



  • Vielen Dank! Es funktioniert jetzt.


Anmelden zum Antworten