return der get-methode ist leer
-
Ich will mir einen string von der Tastatur einlesen und diesen dann zum erzeugen eiens Objektes benutzen, allerdings liefert mir meine getName() Methode nur heiße luft wieder.
Hab im Source mal ein paar Bemerkungen gemacht.
#include <iostream> #include <sstream> #include <fstream> #include <string> #include <ctime> #include <time.h> #include "Datum.h" #include "Member.h" std::string name, gebDatum; std::stringstream stream; int jr=0, mn=0, tg=0, id = 0; void write(Member ); int main() { id++; std::cout<<"Geben Sie bitten den Namen des anzulegenden Mitglieds an"<<std::endl; std::getline(std::cin, name); std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJJJ an"<<std::endl; char pkt; std::cin>>tg>>pkt>>mn>>pkt>>jr; std::cout<<"Member Name: "<<name<<"\n\n\n"; <------------------ Hier ist der Name noch gefüllt if(checkDatum(tg, mn, jr)) { std::cout<<"Member Name: "<<name<<"\n\n\n";<------------------ Hier ist der Name auch noch gefüllt Member b( id, name, tg, mn, jr); std::cout<<"Member Name: "<<b.getName()<<"\n\n\n";<------------------ Nach der Erzeugung das Objekts kann ich über meine getName Methode den namen nicht mehr holen write(b); //std::cout<<b.getGeb(); } else{ std::cout<<"Datumspruefung fehlerhaft"<<std::endl; } return 0; } void write(Member i_member){ std::fstream file; file.open("ausgabe.txt", std::ios::out); std::cout<<i_member.getName(); //file << "Hello"; std::cout<<"Member Name: "<<i_member.getName(); file<<i_member.getName()<<std::endl; file.close(); }Meine Member Klasse:
class Member { private: long id; std::string name; Datum geb; public: Member(long , std::string , int, int, int); ~Member() {} long getId() const {return id;} std::string getName() {return name;} std::string getGeb() { return geb.getDatum();} inline bool setName(std::string& i_name){ if(i_name.size() > 1) return true; else return false; } }; Member::Member(long i_id, std::string i_name, int tg, int mn, int jr): id(i_id), geb(tg,mn,jr) { std::cout<<"Member Konstruktor"<<std::endl; if (!setName(i_name)) i_name = "How knows"; }Meine Datumsklasse:
class Datum{ private: int tag; int monat; int jahr; public: Datum(int, int, int); ~Datum(){} void setDatum(int tg, int mn, int jr); std::string getDatum(); //Prüft ob das Jahr ein schaltjahr ist bool checkYear(int &); //Prüfen ob ein gültiges Datum eingegeben wurde static bool checkDatum(int &, int &, int &); }; Datum::Datum(int tg, int mn, int jr) { std::cout<<"Datum Konstruktor"<<std::endl; tag = tg; monat = mn; jahr = jr; } void Datum::setDatum(int tg, int mn, int jr) { tag = tg; monat = mn; jahr = jr; } std::string Datum::getDatum() { std::string back; std::stringstream temp; temp<<tag<< '.'<<monat<<'.' <<jahr; //schieben des Stringstreams in den Rückgabe-String temp>>back; return back; } bool checkYear(int jr) { char jahr[10]; std::stringstream tempss; std::string tempst; tempss << jr; tempss >> tempst; if (tempst.size() != 4 || tempst.substr(0,1) > "2" ) { return false; std::cout<<"Jahr bitte 4 - Stellig angeben"; } if(jr%400 == 0 && jr %4 == 0) { return true; } else return false; } static bool checkDatum(int tg, int mn, int jr) { if (tg < 1 || tg > 31){return false;} if (mn < 1 || mn > 12){return false;} switch(mn) { case 2: if (checkYear(jr)) { if (tg > 29) return false; } else if (tg > 28) { return false; } break; case 11: if (tg > 30) return false; break; } return true; }
-
Souljumper schrieb:
Ich will mir einen string von der Tastatur einlesen und diesen dann zum erzeugen eiens Objektes benutzen, allerdings liefert mir meine getName() Methode nur heiße luft wieder.
da du Member::name nie initialisierst oder zuweist, ist das auch kein wunder.
-
? ok, was genau mache ich dann hier

std::cout<<"Geben Sie bitten den Namen des anzulegenden Mitglieds an"<<std::endl; std::getline(std::cin, name);oder wie sähe es richtig aus?
-
Souljumper schrieb:
? ok, was genau mache ich dann hier

std::cout<<"Geben Sie bitten den Namen des anzulegenden Mitglieds an"<<std::endl; std::getline(std::cin, name);Hier ließt du eine Zeile von der Tastatur in das Objekt name vom Typ std::string. Das ist soweit korrekt.
Was camper aber meinte, ist, dass du das Objekt name innerhalb deines Klasse Member nirgendwo initialisierst. Sprich, du weißt zwar im Ctor von Member allen anderen Datenelementen Werte zu, nur eben dem Objekt name nicht.
Korrekt wäre es z.B. so:
Member::Member(long i_id, std::string i_name, int tg, int mn, int jr): id(i_id), name(i_name), geb(tg,mn,jr) { std::cout<<"Member Konstruktor"<<std::endl; if (!setName(name)) name = "How knows"; }Wobei der Ctor in diesem Zustand nicht wirklich performant ist...
Gruß Caipi
-
Und die Methode setName() tut bei weitem nicht das, was von ihr erwartet wird - die prüft lediglich, ob der übergebene Name mehr als ein Zeichen enthält.