Klassen-Vektor
-
#include <iostream> #include <conio.h> #include <string> #include <vector> using namespace std; /*FUNKTIONEN GLOBAL*/ bool Neu(); bool Display(); /*VEKTOR*/ vector<Schüler> vSchueler(100); vector<Schüler>::iterator i; ///////////////////////////////////////////////////////////////////// class Schüler { private: int ID; void Edit(); public: static int Zähler; Schüler(); ~Schüler(); long Tel; string Name; void Display(); bool Init(); }; ////////////////////////////////////////////////////////////////////// int Schüler::Zähler = 0; ////////////////////////////////////////////////////////////////////// Schüler::Schüler() { Zähler++; } Schüler::~Schüler() { Zähler--; } bool Schüler::Init() { cout <<"Name:" <<endl; getline(cin, Name); cout <<"Tel.:" <<endl; cin >>Tel; return (true); } int main() { Neu(); Display(); getch(); } bool Neu() { Schüler *ptr; ptr = new Schüler; ptr->Init(); vSchueler.push_back(ptr); } bool Display() { cout <<"Anzahl Schüler: " <<Schüler::Zähler; for(i=vSchueler.begin(); i<vSchueler.end();i++) { cout <<(*i); } }Ich habe leider keine Ahung wie ich den Vektor richtig / bzw sinnvoll (wenn üverhaupt) einsetzen kann.
Wenn man in einer finktion über einen Klassen-Zeiger *ptr eine new [class] Instanz erschafft, wie kann man diese ausserhalb der Funktion ansprechen? Mit return und Referenzen bin ich auf keinen Grünen Zweig gekommen, nun bastel ich mit Vektoren herum, was mir aber auch eher fragwürdig erscheint. Wie löst man dieses Problemchen am besten?
Grüße,
-
Wenn du dich mit dem Pointer-Gefrickel noch nicht auskennst - dann lass es lieber erstmal bleiben.
Warum nicht so:void Neu() { Schüler neuerSchueler; neuerSchueler.Init(); vSchueler.push_back(neuerSchueler); }Abgesehen davon hat dein Vektor bereits 100 nicht-initialisierte (im Sinne von nicht Init()-aufgerufen) Schüler. Das war sicher nicht deine Intention oder?
Dazu kommen noch einige andere Fehler bzw. Probleme.
-
Auch wenn MSVC das zulässt, bei äöüß in Methodennamen kriege ich das kalte Grausen. Wenn du einen Zähler so mitschleifen willst, solltest du auch den Kopierkonstruktor und operator=() entsprechend implementieren, sonst kann es vorkommen das deine Zahlen irgendwann nimmer stimmen. Variabeln solltest du so spät als Möglich deklarieren .. das i für iterator also bevor du es benutzt, nicht ganz am Anfang. Wenn du den Vector irgendwo ausgeben willst geht das so:
Disclaimer: browsercompilerproofed

#include <vector> #include <iostream> void FuellMich(std::vector<int> & vec) { for (int i=0 ; i< 10; ++i) vec.push_back(i); } void Ausgabe(const std::vector<int> & vec) { std::vector<int>::const_interator iter; for (iter = vec.begin(); iter != vec.end(); ++iter) std::cout << *iter; } int main() { std::vector<int> zahlen; FuellMich(zahlen); Ausgabe(zahlen); }Google Stichworte: c++ PLUS [Regel der 3, Parameterübergabe per Value und per Reference, const correctnes]
-
Ja, ich kenne meine Defizite. Ich kämpfe mich immer durch die Bücher, habe manchmal 4 gleichzeitig neben mir liegen. Doch irgendwie lerne ich daraus nie etwas. Oftmals stellt sich mir das Probelm, dass nie wirklich erklärt wird, warum man dies oder das machen sollte und wozu man es nutzen kann.
Welches Buch würdet ihr mir den empfehlen?
zZ beitze ich
C++ lernen und professionell anwenden (bisher am besten)
Spieleprogrammierung mit c++ von heiko kalista
Einstieg in C++ von Arnold Willemer
c++ von A bis Z von *Dem, dessen name nicht genannt werden darf*
-
Hm, aber cout<<*iter funzt nicht... Kein Operator stimmt it dem operanten überein
-
Ja, wenn du deine Klasse "Schüler" über Stream-Operatoren ausgeben willst, mußt du selber eine Überladung dafür bereitstellen. Alternativ könntest du auch die Display()-Methode verwenden, die du zwar deklariert, aber nicht ausformuliert hast:
for(iter = vSchueler.begin(); iter !=vSchueler.end(); ++iter) iter->Display();