n Instanzen eins Objektes erzeugen
-
Hallo.
Ich habe nun wieder mal etwas Zeit gefunden um c++ zu lernen.
Ich möchte Personen und deren E-Mail Adressen verwalten.
Jetzt erzeuge ich laut Lehrbuch mit z.B. person1 eine Instanz von datensatz.
Meinetwegen auch eine person2, person3, ....int main(){ datensatz person1; person1.daten_eingabe("Max","Mustermann","max@muster.com"); person1.ausgabe_name(); return 0; }Ich weiß nicht ob ich komplett auf der Leitung stehe, aber wie kann ich
jetzt n Instanzen erzeugen. Solange es heißt weiteren Datensatz eingeben,
soll eine weitere Instanz personXY erzeugt werden.danke.
michi
-
indem du die objekte in einem container speicherst. entweder ein array mit fester größe oder einem typ variable größe.
letzeres dann z.b. so:
#include <vector> ... int main() { vector<datensatz> daten; // dynamischer container für typ datensatz while(true) { datensatz person; getEingabe(person); // irgendwie person mit daten füllen daten.push_back(person); // datensatz in liste einfügen } }in jedem schleifendurchlauf wird ein neuer datensatz an den container "daten" angefügt. auf deine daten zugreifen kannst du dann über den [] operator
daten[12]; // liefert datensatz nr. 13 zurückdie größe des containers, also die anzahl der datensätze, kannst du über daten.size() bekommen
-
hallo.
danke für die antwort.
ich habe jetzt versucht das in einem Vektor zu speichern. Weiters hab ich das Programm noch ein bisschen umgebaut.
Leider hab ich probleme auf den vektor zuzugreifen bzw. alle daten der vektoren auszugeben sobald man keine weiteren daten mehr eingibt.Kann mir jemand sagen wie die funktion daten_ausgabe ausschauen muss.
#include <iostream> #include <string> #include <vector> using namespace std; class datensatz { private: string vorname; string nachname; string email; public: void daten_eingabe() { vector<datensatz> daten; while(true) { cout << "Daten eingeben:(Vorname Nachname Email)"; cin >> vorname >> nachname >> email; datensatz person; daten.push_back(person); cout << "Weitere Daten (J/n)"; char weiter; cin >> weiter; if (weiter=='n'){ break; } } } void daten_ausgabe (){ for (int i=0; i<10; i++) { // ????????????? } } }; int main(){ datensatz a; a.daten_eingabe(); a.daten_ausgabe(); return 0; }danke
-
major schrieb:
Kann mir jemand sagen wie die funktion daten_ausgabe ausschauen muss.
Dein Design ist imho sehr strange. Stellen wir dieses doch zuerst einmal um.
Zuerst einmal hast du einen Datensatz.class data { string surename, name, email; public: void daten_eingabe() { cout << "Daten eingeben:(Vorname Nachname Email)"; cin >> surename >> name >> email; } void daten_ausgabe() { cout << "surename: " << surename; cout << "\nname: " << name; cout << "\nemail: " << email << endl; } };Von diesem Datensatz erstellst du jetzt einen Vektor.
vector<data> data_vec;Wenn du jetzt für den Datensatz nummer x etwas einlesen möchtest, schreibst du:
data_vec[x].daten_eingabe(); // an position x muss natürlich Speicher reserviert sein!Das einlesen des Vektors über den Benutzer realisierst du am besten über eine Funktion.
void read_into(vector<data>& v) { do { data tmp; tmp.daten_eingabe(); v.push_back(tmp); cout << "another data? (y==YES): "; char c; cin >> c; } while(c == 'y'); }So... Das fürs erste. Aber: viel schöner als die Methoden daten_eingabe/daten_ausgabe sind überladene I/O-Operatoren.
Also... schnell die Klasse data umbauen:class data { string surename, name, email; public: friend istream& operator>>(istream& is, data& rhs) { is >> rhs.surename >> rhs.name >> rhs.email; return is; } friend ostream& operator<<(ostream& os, const data& rhs) { os << "surename: " << rhs.surename; os << "\nname: " << rhs.name; os << "\nemail: " << rhs.email << endl; return os; } };Jetzt noch schnell die Funktion readin() ändern in
void read_into(vector<data>& v) { do { cout << "please insert the data:\n"; data tmp; cin >> tmp; v.push_back(tmp); cout << "another data? (y==YES): "; char c; cin >> c; } while(c == 'y'); }Jetzt kannst du natürlich noch die Funktion read_into() als Template gestalten, so dass sie letztlich von einem beliebigen Container, der die Methode push_back() besitzt, solange beliebige Daten, die die I/O-Operatoren überladen haben, einließt wie dies der Benutzer zulässt... aber dies überlasse ich dir als Homework. ;).
Gruß Caipi