Forum: PC-Programmierung CPP, Structs, Projektierung Undefined Refference to.


von Michael (Gast)


Lesenswert?

Hallo,

Wir besprechen im CPP-Unterricht gerade Structs, in einer Übungsaufgabe 
soll ein Programm geschrieben werden, dass die Struktur Datum über 
Funktionen einliest. Dabei soll in der Main eine Struktur von Typ Datum 
erstellt, eingelesen und ausgegeben werden.

Die Funktionen zur Ein/Ausgabe stehen in Datum.cpp.
Die Struktur Datum selbst, sowie die Funktionen zur Ein/Ausgabe stehen 
in der Datum.hpp.

Problem ist nun, dass der Linker die Fehlermedlung:
"Undefined Reference to einlesen(Datum)" zurückgibt.

Der Code sieht so aus: Main.cpp
1
#include <cstdlib>
2
#include <iostream>
3
#include "Datum.hpp"
4
using namespace std;
5
6
int main(int argc, char *argv[])
7
{
8
    Datum meinD;
9
    cout<<"Test";
10
    einlesen(meinD);
11
    ausgeben(meinD);
12
    system("PAUSE");
13
    return EXIT_SUCCESS;
14
}
Datum.cpp
1
#include <cstdlib>
2
#include <iostream>
3
#include "Datum.hpp"
4
using namespace std;
5
6
void einlesen(Datum &d)
7
{
8
    cout<<"Bitte Tag eingeben ";
9
    cin>>d.tag;
10
    cout<<"\n Bitte Monat eingeben ";
11
    cin>>d.monat;
12
    cout<<"\n Bitte Jahr eingeben ";
13
    cin>>d.jahr;
14
}
15
16
void ausgeben(Datum d)
17
{
18
    cout<<"Tag "<<d.tag<<" / Monat "<<d.monat<<" / Jahr "<<d.jahr;
19
}
Datum.hpp
1
struct Datum
2
{
3
    int tag;
4
    int monat;
5
    int jahr;
6
};
7
8
void einlesen(Datum);
9
void ausgeben(Datum);

Warum findet er die Funktion einlesen nicht?
In der Main.cpp wird Datum.hpp includet
in Datum.hpp stehen auch die Signaturen der Funktionen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael schrieb:
> in Datum.hpp stehen auch die Signaturen der Funktionen.

Sieh Dir genau die Definition und die Implementation von "einlesen" an. 
Was in "datum.hpp" steht, passt nicht zu dem, was in "datum.cpp" steht.

von test (Gast)


Lesenswert?

void einlesen(Datum);

ist was ganz andere als

void einlesen(Datum&);

von Sven B. (scummos)


Lesenswert?

"undefined reference" weist immer darauf hin, dass Du ein Objekt zwar 
deklariert, aber nicht definiert hast. Die wahrscheinlichsten zwei 
Ursachen dafür sind
 -> Eine cpp-Datei fehlt in der Compiler-Kommandozeile
 -> Funktionssignaturen von Deklaration und Definition passen nicht 
zusammen

Letzteres ist auch hier der Fall, wie ja schon gesagt wurde.

Übrigens solltest du folgendes ändern:
void ausgeben(Datum d) -> void ausgeben(const Datum& d)
system("PAUSE") -> cin.get();

Gruß,
Sven

von Michael (Gast)


Lesenswert?

Danke, nun läufts!

Stimmt wenn im Header nur Funktion(Datum) steht ist es eine Übergabe per 
Wert.
Durch das & wird daraus eine Übergabe by Reference nur so kann das Datum 
auch geändert werden.

Eine Funktion Ausgabe mit by Value gab es nicht, und so konnte er sie 
nicht finden.

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.