Anfänger


  • Mod

    AnfängerPlusPlus schrieb:

    gezielt ein Konto des Vektors aussuchen und Zugriff auf die Werte haben. Wie könnte man diese Option am besten umsetzen?

    Indem du eine entsprechende Funktion anbietest. Diese Funktion könnte einen Index des Vectors als Argument nehmen und dann gibt sie entweder das entsprechende Element des Vectors zurück oder besser, falls dir das was sagt, eine Referenz darauf. Und nochmal Bonuspunkte, wenn du diese Funktion operator[] nennst, aber vermutlich führt das zu weit.

    PS: Sachen wie vector<kunde>::iterator i; haben übrigens nichts als Klassenmember zu suchen!



  • Könnte man das auch über eine Suche der Membervariablen schaffen? Ich mein ich sag mal ein Kunde kommt zur Bank und sagt er hat seine Karte verloren. Im richtigen Leben wird dann nach Name etc gefragt und danach ermittelt..kann man sowas mit Grundkenntnissen umsetzen?



  • Nochmal, vllt war das undeutlich. Ist es möglich, einen gesamten Vektor nach definitionen von membervariablen zu durchsuchen?


  • Mod

    AnfängerPlusPlus schrieb:

    Nochmal, vllt war das undeutlich. Ist es möglich, einen gesamten Vektor nach definitionen von membervariablen zu durchsuchen?

    Ja. Du gehst ihn durch und guckst nach. Falls der Container sortiert ist, geht das auch noch effizienter, kommt eben drauf an.

    Für beide Fälle gibt's auch was Fertiges in der Standardbibliothek.



  • Ich glaub das ist der richtige Weg. Aber scheinbar ist ein Punktoperator hier nicht zulässig, warum?

    void suchekunde (kunde name) {
    		vector<kunde>:: iterator i;
    		for (i=kundenliste.begin();i!=kundenliste.end();i++)
    			if (kunde.name==name)
    				cout << 
    }
    	}
    


  • parameter ist (string name)


  • Mod

    Fehlermeldung, Code?

    Ich habe dir die Links am Anfang nicht zum Spaß gepostet. Deine Fragen sind schrecklich unverständlich gestellt. Lies die Links! Hier ist noch einer, bezüglich deiner letzten "Frage":
    http://www.c-plusplus.net/forum/304133



  • Laut dem Link anscheinend ein compilerfehler.
    Fehlermeldung: "dateipfad"(45): error C2059: Syntaxfehler: '.'

    es geht um die unterste methode der klasse verwaltung in der if-bedingung.

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    class kunde {
    private:
    
    	int id;
    	int pin;
    	int cash;
    	string name;
    
    public:
    	static int kundenid;
    	kunde () {
    		cout << "Kunde wurde erstellt ";
    		kundenid++;
    		id = kundenid;
    		cout << "Kunde mit der ID " << id << " wurde erstellt" << endl;
    		cout << "Namen eingeben:" << endl;
    		cin >> name;
    	}
    };
    
    class verwaltung {
    private:
    	vector<kunde>kundenliste;
    
    public:
    	void neuerkunde () {
    		kunde neuerkunde;
    		kundenliste.push_back (neuerkunde);
    	}
    
    	void size (){
    			cout << kundenliste.size();
    	}
    
    	void suchekunde (string name) {
    		vector<kunde>:: iterator i;
    		for (i=kundenliste.begin();i!=kundenliste.end();i++) {
    			if (kunde.name==name)
    				cout << *i;
    		}
    	}
    };
    
    int kunde::kundenid;
    
    int main() {
    
    	kunde::kundenid=0;
    
    	verwaltung boss;
    
    	boss.neuerkunde();
    	boss.neuerkunde();
    	boss.size();
    	boss.suchekunde("test");
    
    	cout << endl;
    
    	system ("Pause");
    }
    


  • Also um den Punkt in der If-Bedingung. Ich will den eingegebenen Parameter in der Main (methode "suchekunde") übergeben um einen vergleich zwischen den vektorinhalten von kundenliste zu machen, bezüglich der privaten membervariablen "name", der klasse kunde, die sich im vector befindet, um zu schauen ob sich etwas identisches finden lässt.



  • Wenn ich statt kunde.name, i.name mache oder *i.name (nur relevant falls das jemand als Lösung vorschlägt), kommt :
    (45): error C2039: 'name': Ist kein Element von 'std::_Vector_iterator<_Myvec>
    und ein fehlercode der sehr oft das hier wiederholt:

    1>          ]
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(944): oder "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)"
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(951): oder "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)"
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    

  • Mod

    AnfängerPlusPlus schrieb:

    Wenn ich statt kunde.name, i.name mache oder *i.name (nur relevant falls das jemand als Lösung vorschlägt), kommt :

    Programmierung durch wildes Raten? Code ist Logik pur! Du musst von jedem Zeichen in deinem Programm ganz genau wissen, warum du es wo setzt (oder nicht setzt)! Wenn du deinen eigenen Code nicht verstehst, ist dir kaum zu helfen.

    i ist ein Iterator. Der zeigt irgendwie auf einen Kunden aus dem Kundenvector. Du musst ihn dereferenzieren, wenn du auf das zugreifen möchtest, worauf er zeigt. Also mit Sternchen. *i.name ist leider falsch, da . stärker bindet als *. Da steht also effektiv *(i.name) . Und der Iterator hat kein Feld namens name , daher die Fehlermeldung*. Also muss es umgekehrt lauten: (*i).name . Das ist aber reichlich unpraktisch zu schreiben für etwas, was man andauernd braucht. Daher gibt es die Abkürzung i->name . Damit kommst du einen Schritt weiter. Du wirst feststellen, dass dies einen anderen Fehler auslöst, aber den überlasse ich erst einmal dir zur Lösung, da du dabei etwas über Kapselung, Klassendesign und so weiter lernen kannst. Vorausgesetzt, du versuchst den Folgefehler durch Nachdenken zu lösen, anstatt durch wildes Tippen irgendwelcher Zeichensequenzen.

    *: Die du leider unvollständig wiedergibst. Du hast bloß ein paar der letzten Zeilen der Meldung gepostet. Du hast gar nicht erst versucht, die Fehlermeldung zu verstehen, sonst wäre dir das nicht passiert 👎 . Wenn du versucht hättest, sie zu verstehen (denk dran: Fehlermeldungen von oben nach unten zu lesen!), hättest du als erste Meldung ein relativ klares

    ‘std::vector<kunde>::iterator’ has no member named ‘name’
    

    (GCC-Fehlermeldung, dein Microsoftcompiler hat sicher etwas ähnliches ausgegeben) erhalten. Was ganz genau das ausdrückt, was ich oben erklärt habe.



  • Rein zu deiner Information (bezüglich deines letzten Satzes), leider nicht.
    er sagt genau das selbe nur mit "->" statt mit "."
    (45): error C2059: Syntaxfehler: '->'

    Ich werd mir deine Antwort noch paar mal durchlesen müssen, mal schauen.


  • Mod

    AnfängerPlusPlus schrieb:

    Rein zu deiner Information (bezüglich deines letzten Satzes), leider nicht.
    er sagt genau das selbe nur mit "->" statt mit "."
    (45): error C2059: Syntaxfehler: '->'

    🙄 Code? Das ist das letzte Mal, dass ich eine Gegenfrage dieser Art stelle. Das nächste Mal antworte ich einfach gar nicht mehr, wenn die Frage ohne Gegenfragen nicht beantwortbar ist.



  • Genau der selbe Code wie oben. in der if bedingung, egal ob ich "." oder "->" mache, er sagt entweder syntaxfehler "->" oder syntaxfehler "."



  • Krass es klappt, danke! 😃



  • AnfängerPlusPlus schrieb:

    Krass es klappt, danke! 😃

    Offensichtlich war es doch nicht der selbe code. Daher auch die Mahnung von Sepp Code zu posten nicht zu beschreiben. Jetzt wissen andere Anfänger immer noch nicht, was Dein Problem war und wie Deine Lösung aussieht.



  • Noch eine Frage unzwar wenn ich den Code wie ich ihn gleich poste kompilieren will, kommt folgender Fehler: "Kein Zugriff auf Private Membervariable name" (ausgelöst durch eine methode der klasse "verwaltung", unzwar "suchekunde", die die Membervariable "name" der Klasse "Kunde" zum vergleichen verwedendet). Ist es gängig dieses Problem zu lösen, indem man in der Klasse "Kunde", "friend class verwaltung;" schreibt und die Klasse "Verwaltung" vorwärtsdeklariert. Oder gibt es bessere, empfehlenswertere Möglichkeiten.

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    class kunde {
    private:
    
    	int id;
    	int pin;
    	int cash;
    	string name;
    
    public:
    	static int kundenid;
    	kunde () {
    		kundenid++;
    		id = kundenid;
    		cash = id;
    		cout << "Namen eingeben:" << endl;
    		cin >> name;
    		cout << "Kunde mit der ID " << id << " wurde erstellt" << endl;
    	}
    
    	void zeigekundendaten () {
    		cout << "Name: " << name << endl;
    		cout << "Kontostand: " << cash << endl;
    	}
    };
    
    class verwaltung {
    private:
    	vector<kunde>kundenliste;
    
    public:
    	void neuerkunde () {
    		kunde neuerkunde;
    		kundenliste.push_back (neuerkunde);
    	}
    
    	void size (){
    			cout << kundenliste.size();
    	}
    
    	void suchekunde (string name) {
    		vector<kunde>:: iterator i;
    		for (i=kundenliste.begin();i!=kundenliste.end();i++) {
    			if (i->name==name) {
    				cout << "gefunden: ";
    				i->zeigekundendaten();
    			}
    			else 
    				cout << "Kunde nicht gefunden" << endl;
    		}
    	}
    };
    
    int kunde::kundenid;
    
    int main() {
    
    	kunde::kundenid = 0;
    	char option;
    	string name;
    
    	verwaltung boss;
    
    	do {
    	cout << "Guten Tag, Boss." << endl;
    	cout << "(1) Neuen Kunden anlegen" << endl;
    	cout << "(2) Kunden suchen" << endl;
    	cout << "(3) Kundenanzahl anzeigen" << endl;
    	cout << "(B) Programm beenden" << endl;
    	cin >> option;
    
    		if (option=='1')
    	boss.neuerkunde();
    		else if (option=='2') {
    		cout << "Namen eingeben: ";
    		cin >> name;
    	boss.suchekunde(name);
    	}
    		else if (option=='3')
    	boss.size();
    		else 
    	cout << "Ungültige eingabe" << endl;
    	cout << endl;
    	} while (option != 'b' );
    }
    


  • Doch es war der selbe code. den folgefehler hatte ich aber "behoben" indem ich die private membervariable "name" vorrübergehend public gemacht habe um in die Konsole zu kommen und meine funktion testen zu können. Darüber hinaus (An die angesprochenen Leute die evtl das selbe Problem haben), habe ich in der Methode "suchekunde" änderungen vorgenommen, die im grade geposteten code ersichtlich sind, inspiriert von seppjs post über iteratorfunktion.



  • AnfängerPlusPlus schrieb:

    Noch eine Frage unzwar wenn ich den Code wie ich ihn gleich poste kompilieren will, kommt folgender Fehler: "Kein Zugriff auf Private Membervariable name" (ausgelöst durch eine methode der klasse "verwaltung", unzwar "suchekunde", die die Membervariable "name" der Klasse "Kunde" zum vergleichen verwedendet). Ist es gängig dieses Problem zu lösen, indem man in der Klasse "Kunde", "friend class verwaltung;" schreibt und die Klasse "Verwaltung" vorwärtsdeklariert. Oder gibt es bessere, empfehlenswertere Möglichkeiten.

    Die übliche Vorgehensweise ist es Getter- und Settermethoden zu implementieren.

    mfg Martin



  • Nur ne kleine Anmerkung dazu: Setter nur wenn man auch wirklich Setter braucht.
    Oft braucht man aber nur ganz bestimmte Operationen über die Werte geändert werden dürfen und nicht grundsätzlich Setter zu jedem Wert den man einzeln abfragen kann.

    Beispielsweise kann es durchaus Sinn machen den Primary-Key abfragbar zu machen, aber ändern sollte man ihn nicht können.
    Und bei einem Konto ist es üblich das man den Kontostand abfragen kann, sowie was draufaddieren (aufbuchen/einzahlen) bzw. subtrahieren (abbuchen/abheben), aber setzen sollte man den Kontostand oft nicht können.


Anmelden zum Antworten