Klassen
-
Ich bin gerade bei den Klassen und schon wieder habe ich ein Problem :p
Meine 3 Dateien:anschrift.h
#ifndef ANSCHRIFT_H_INCLUDED #define ANSCHRIFT_H_INCLUDED #include <iostream> #include <string> using namespace std; class anschrift{ public: void writename(string name); void writeage(int age); private: string name; int age; }; #endif // ANSCHRIFT_H_INCLUDEDanschrift.cpp
#include <iostream> #include <string> #include "anschrift.h" using namespace std; void anschrift::writename(string name){ //Hier mit der Auswertung komme ich nicht weiter (string name soll "Name" sein) }main.cpp
#include <iostream> #include <string> #include "anschrift.h" using namespace std; int main(){ anschrift erste; erste.writename("Name"); return 0; }Ich bekomme die Fehlermeldung :
undefined reference to 'anschrift::writename(std::string)'Gruß
ps: Mit so vielen Fragen von mir wird euch wenigstens nicht langweilig

-
Dann hast du anschrift.cpp nicht eingebunden.
-
outsch. Bitte kein "using namespace ..." in header Dateien
LG
-
Ich versteh den Sinn der Klasse nicht. Du hast zwei private Member, die du aber garnicht nutzt.
Die Memberfunktionen nutzen nur die Parameter, die du ihnen übergibst. Du könntest also genauso die Klasse einfach weglassen und schreiben
std::cout << "Name\n";
Selbst wenn du die Klasse willst, dann definiere doch bitte einen Konstruktur, der ordentlich name und alter initialisiert und die Funktionen geben die privaten Member aus. Noch besser, du überlädst den "<<" Operator für deine Klasse (oder struct). Sooo schwer ist das nicht...Oder versteh ich hier was falsch?
LG
-
hardware schrieb:
Oder versteh ich hier was falsch?
Ich möchte einfach nur etwas in diese beiden Variablen speichern... bin gerade neu in dem Thema Klassen eingestiegen und dann versuch ich das. Was in "string name" drinn steht ist letzendlich egal. Weil nur das Buch lesen und das nicht praktisch zu versuchen ist auch mist...
Also könnte ihr mir nun helfen?
-
Womit baust du das?
manni66 hat dir schon den richtigen Tipp gegeben.
-
Skeptar schrieb:
Ich möchte einfach nur etwas in diese beiden Variablen speichern...
Welche Variablen? erste.name und erste.age? Wenn ja: Die Funktionen, wenn man denn Funktionen dafür benutzen will, würde man "Setter" nennen.
Ich sehe allerdings den Sinn nicht in einer reinen Datenhaltungsklasse, die diese Variablen privat macht, wenn jeder sie sowieso per Setter ändern kann. In 99% der Fälle, wo man sich denkt "vielleicht will ich in der Funktion später auch noch mehr machen, als nur eine Variable setzen", passiert dann doch nichts mehr und man hätte sich die Sache mit den privaten Datenelementen sparen können. Das ist vielleicht auch Geschmackssache.
Und sonst: Diesen Linkerfehler bekommst du, weil du beim Versuch die ausführbare Datei zu erzeugen
anschrift.cppanscheinend nicht berücksichtigt hast.
-
manni66 schrieb:
Dann hast du anschrift.cpp nicht eingebunden.
Stimmt. In der main fehlt ein #include "anschrift.cpp"

-
Kleiner Troll schrieb:
manni66 schrieb:
Dann hast du anschrift.cpp nicht eingebunden.
Stimmt. In der main fehlt ein #include "anschrift.cpp"

Wehe er glaubt das wegen dir!
-
Okey klappt danke.
Krümelkacker dieser Code soll auch keinen Sinn haben ich wollte es einfach nur testen
-
Skeptar schrieb:
Okey klappt danke.
Krümelkacker dieser Code soll auch keinen Sinn haben ich wollte es einfach nur testen
Darf ich fragen was geklappt hat?
-
Ja wieso nicht?
Also ich habe den Code ein wenig umgeändert so das nun in der Variable "name" ein Text drin steht:anschrift.cpp
#include <iostream> #include <string> #include "anschrift.h" using namespace std; void anschrift::name_eingeben(string eingabe){ name=eingabe; cout << "Ihr Name ist: " << name; }main.cpp
#include <iostream> #include <string> #include "anschrift.h" #include "anschrift.cpp" using namespace std; int main(){ anschrift erste; cout << "Bitte Ihren Namen eingeben: "; string name; cin >> name; erste.name_eingeben(name); return 0; }Ist das denn so richtig?
Weil das gewünschte Ergebnis hat es ja.
Und ja ich weiß es ergibt kein Sinn

So richtig geschnallt habe ich es zwar noch nicht aber werde das noch ein wenig weiter üben mit ein paar "Sinvollen" Variablen und Aufgaben

Gruß
-
Skeptar schrieb:
Ja wieso nicht?
Also ich habe den Code ein wenig umgeändert so das nun in der Variable "name" ein Text drin steht:anschrift.cpp
#include <iostream> #include <string> #include "anschrift.h" using namespace std; void anschrift::name_eingeben(string eingabe){ name=eingabe; cout << "Ihr Name ist: " << name; }main.cpp
#include <iostream> #include <string> #include "anschrift.h" #include "anschrift.cpp" using namespace std; int main(){ anschrift erste; cout << "Bitte Ihren Namen eingeben: "; string name; cin >> name; erste.name_eingeben(name); return 0; }Ist das denn so richtig?
Weil das gewünschte Ergebnis hat es ja.
Und ja ich weiß es ergibt kein Sinn
(Das ich für diese Aufgabe eine Klasse verwende)So richtig geschnallt habe ich es zwar noch nicht aber werde das noch ein wenig weiter üben mit ein paar "Sinvollen" Variablen und Aufgaben

Gruß
-
Nunja, du könntest/solltest "anschrift" groß schreiben, also "Anschrift". Zumindest kenne ich die "Konvention", Klassen groß zu schreiben.
Deine Funktion macht zwei Aufgaben. Einmal anschrift teilweise initialisieren und einmal den name wieder ausgeben. Wie wärs denn mit
public: anschrift(string n, int a) :name{n], alter{a} { } // eigtl. noch überprüfen // e.g. kein negatives alter ostream& operator<<(ostream os, anschrift an) { os << "Name:\t" << an.name << '\n' << "Alter:\t" << an.alter << '\n'; } main(): anschrift erste("Name", 50); cout << erste; // natürlich kein compilierbarer code
-
P.S.: Eine Anschrift sind Name und Alter ja nicht gerade...
-
Ja das ist ja gut

Ich wollte einfach nur testen ob das klappt und das tut es nun und nun kann ich es ausbessern, denn ich weiß nun wie ich auf die Variablen zugreife

Damit ist der Thread wohl geschlossen
-
Das include anschrift.cpp ist ja wohl nicht dein Ernst!
-
manni66 schrieb:
Das include anschrift.cpp ist ja wohl nicht dein Ernst!
Kleiner Troll schrieb:
manni66 schrieb:
Dann hast du anschrift.cpp nicht eingebunden.
Stimmt. In der main fehlt ein #include "anschrift.cpp"

rofl
-
asfdlol schrieb:
manni66 schrieb:
Das include anschrift.cpp ist ja wohl nicht dein Ernst!
Kleiner Troll schrieb:
manni66 schrieb:
Dann hast du anschrift.cpp nicht eingebunden.
Stimmt. In der main fehlt ein #include "anschrift.cpp"

rofl
Troll halt.