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.
-
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 dassausgabe
jetzt auch einen Körper hat. Das macht man so nicht.In die becher.cpp gehört:
- ein
#include "becher.h"
- eine Definition für die Funktion:
void Becher::ausgabe() { std::cout << inhalt << std::endl; }
- 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
- ein
-
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.