Anfänger



  • 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.



  • AnfängerPlusPlus schrieb:

    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.

    Damit hast Du aber sicherlich nicht den Syntaxfehler "behoben".


Anmelden zum Antworten