Dynamische Anzahl von Istanzen einer Klasse anlegen.


  • Mod

    Tyle schrieb:

    Die Zeiger waren die Anforderung.

    Ich bin mir sehr sicher, dass du das falsch verstanden hast. Zeiger auf std::string machen 0 Sinn.

    Hmm, Zeiger auf Zeichenketten...
    Bist du sicher, dass du C++ machst, kein C? Wird oft verwechselt.



  • Stimmt, die Zeiger waren nicht unbedingt erfordert.
    Und ja es ist C++... sonst würden ja keine Klassen vorkommen.

    Der Code funktioniert aber auch nicht. Habe das mal ausprobiert, bekomme dort auch ne Fehlermeldung vom Speicher bei der Ausführung:

    #include <vector>
    
    ...
    
    int main() {
    
        int iAnzahl;
    
        // Anzahl der zu erstellenden Studenten einlesen
        cout << "Wieviele Studenten wollen Sie anlegen? : ";
        cin >> iAnzahl;
        cout << "Sie wollen " << iAnzahl <<" Studenten anlegen!" << endl;
    
    vector<Student> studenten;
    
        for (int i=1; i<=iAnzahl; i++) {
            cout << endl << "Bitte " << i << ". Student anlegen:" << endl;
            Student tmp;
            tmp.einlesen();
            studenten.push_back(tmp);
        }
        for(int i = 0; i < studenten.size(); ++i)
            studenten[i].ausgeben();
    

  • Mod

    Wie sehen Student und Student::einlesen aus?



  • Tyle schrieb:

    Die Zeiger waren die Anforderung. Bin noch dabei das Klassenkonzept zu lernen.

    Ist meine erste Klasse 🙄

    Du hast viel zuviele Sterne ---> das mit den Zeigern ist Mist. Wenn das die - bescheuerte - Anforderung ist, lern erst das Zeigerkonzept.



  • Das ist megamässig schlechter C++ Stil den euer Professor euch da beibringt.



  • Der Lehrstuhl von OOP ist wirklich nicht sonderlich gut. Das mussten wir leider auch schon feststellen.

    So ich habe mich nochmal drangesetzt und das Programm jetzt vernünftig geschrieben und auch wesentlich unkomplizierter.

    Das mit den Zeigern habe ich falsch verstanden und ist daher auf meinen Mist gewachsen.

    Hier das Programm:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Student {
    public:
    	void einlesen();
    	void ausgeben();
    	Student();
    	~Student();
    
    private:
    	string vorname_;
    	string nachname_;
    	string matrikel_;
    	string studiengang_;
    	int alter_;
    
    };
    
    void Student::einlesen() {
    	cout << "Bitte Vornamen eingeben: ";
    	cin >> vorname_;
    	cout <<endl << "Bitte Nachname eingeben: ";
    	cin >> nachname_;
    	cout << endl << "Bitte Matrikelnummer eingeben: ";
    	cin >> matrikel_;
    	cout << endl << "Bitte Studiengang eingeben: ";
    	cin >> studiengang_;
    	cout << endl << "Bitte ihr Alter eingeben: ";
    	cin >> alter_;
    	cout << endl;
    }
    
    void Student::ausgeben() {
    	cout << matrikel_ <<", " << vorname_ << " " << nachname_ << endl;
    	cout << "Alter: " << alter_ << " Jahre" << endl;
    	cout << "Studiengang: " << studiengang_ << endl;
    }
    
    //Konstrukor und Destruktor
    Student::Student()  {}
    Student::~Student() {}
    
    int main () {
    
    	int n;
    	cout << "Bitte die Anzahl der Studenten angeben die Sie anlegen möchten: ";
    	cin >> n;
    	cout << endl;
    
    	Student *studenten = new Student[n];
    
    	for (int i=0; i<n; i++) {
    		cout << "Bitte " << (i+1) << ". Studenten anlegen!" << endl;
    		studenten[i].einlesen();
    	}
    
    		for (int i=0; i<n; i++) {
    		studenten[i].ausgeben();
    		cout << endl;
    	}
    
    	delete [] studenten;
    
    	system("pause");
    	return 0;
    
    }
    

  • Mod

    Wenn dein Konstruktor und Destruktor leer sind, bietet es sich an, diese wegzulassen.
    http://en.wikipedia.org/wiki/Special_member_functions

    Was hier am Design noch ungünstig ist, ist die Vermischung von Schnittstelle und Programmlogik. Ein Student hat keine Konsolenausgabe* oder -eingabe, das kannst du leicht an dir selber mal ausprobieren 😉 . Er kann seine Daten irgendwo hinterlassen und als Zugeständnis an die Existenz des Studenten im Computer können diese Daten sicherlich auch wieder gelesen werden. Aber dass dies unbedingt über cin/cout erfolgen soll, das sollte einem Studenten an sich eigentlich einmal egal sein, das gehört nicht zum Studentsein.

    Konkret will ich auf Folgendes hinaus, was aber bei Euch wahrscheinlich noch nie drangekommen ist (und vielleicht auch nie wird):
    Google: c++ overload stream operator

    *: cout und cin stehen natürlich für character out und -in, nicht console. Muss auch praktisch nicht identisch sein, wusste bloß nicht wie ich das auf Deutsch ausdrücken sollte.



  • Hinweis: Statt der Funktionen eingeben() und ausgeben() sollte man normalerweise einen eigenen Eingabeoperator (operator >>) bzw. Ausgabeoperator (operator <<) benutzen oder die Daten direkt im Konstruktor belegen. Da diese Aufgabe aber nur als vereinfachter Einstieg dienen soll, werden hier noch keine Operatoren und Konstruktoren verwendet.

    Meinst du das? 😃

    Kommt wohl noch später, bin jetzt gerade an der nächsten Klasse dran, die schon was umfangreicher wird und auch das header Prinzip umfasst.

    Edit:
    Später ist wohl jetzt, ab jetzt muss ich die Überladung der Stream-Operatoren lernen.


  • Mod

    Tyle schrieb:

    Meinst du das? 😃

    Ja. gut zu wissen, dass es dem Lehrer nicht unbekannt ist.



  • Gibt es dazu ein gutes Tutorial, welches das Konzept anschaulich erklärt? Ich brauche das nämlich ab sofort.

    Glaube hier wird das gut beschrieben:
    http://www.c-plusplus.net/forum/232010-full


Anmelden zum Antworten