Instanz einer Klasse an eine Funktion übergeben



  • Hallo,

    ich arbeite aktuell ein paar Aufgaben aus einem Buch ab. In dieser Aufgabe soll ich eine Party simulieren, dabei werden Objekte mit dem Namen der Teilnehmer erzeugt, sobald sich zwei kennengelernt haben, sollen die Namen des jeweils anderen unter Bekannte abgespeichert werden. Das klappt alles auch soweit, nur in der Funktion lerntKennen() habe ich Probleme.

    void Teilnehmer::lerntKennen(Teilnehmer s) {
        if(name!=s.gibNamen() && !kennt(s)) {
            bekannte.push_back(s);
            s.lerntKennen(*this);
            //std::cout << s.gibNamen() << " " << this->gibNamen() << '\n';
        }
    }
    

    Hier möchte ich, dass die Funktion sich selbst aufruft, allerdings als eine Funktion des Freundes mit dem Parameter des aktuellen Objektes. Leider wird aber der Name nicht in der Bekanntenliste des Freundes abgespeichert.

    Hier mal die Quellcodes:

    main.cpp

    #include "teilnehmer.h"
    #include <vector>
    #include <iostream>
    using namespace std;
    
    int main() {
        Teilnehmer otto("Otto");
        Teilnehmer andrea("Andrea");
        Teilnehmer jens("Jens");
        Teilnehmer silvana("Silvana");
        Teilnehmer miriam("Miriam");
        Teilnehmer paul("Paul");
        vector<Teilnehmer*> alle {&otto, &andrea, &jens, &silvana, &miriam, &paul};
        andrea.lerntKennen(jens);
        silvana.lerntKennen(otto);
        paul.lerntKennen(otto);
        paul.lerntKennen(silvana);
        miriam.lerntKennen(andrea);
        jens.lerntKennen(miriam);
        jens.lerntKennen(silvana);
        if(jens.kennt(andrea)) {
            cout << "Jens kennt Andrea\n";
        }
        // Ausgabe aller Teilnehmer mit Angabe, wer wen kennt:
        for(auto teilnehmerPtr : alle) {
            cout << teilnehmerPtr->gibNamen() << " kennt: ";
            teilnehmerPtr->druckeBekannte();
            cout << endl;
        }
    }
    

    teilnehmer.cpp

    #include "teilnehmer.h"
    #include <vector>
    #include <string>
    #include <iostream>
    
    Teilnehmer::Teilnehmer(std::string n) {
        name=n;
    }
    
    std::string Teilnehmer::gibNamen() {
        return name;
    }
    
    void Teilnehmer::druckeBekannte() {
        for(int i=0; i<bekannte.size(); ++i) {
            std::cout << bekannte[i].gibNamen() << " ";
        }
    }
    
    void Teilnehmer::lerntKennen(Teilnehmer s) {
        if(name!=s.gibNamen() && !kennt(s)) {
            bekannte.push_back(s);
            s.lerntKennen(*this);
            //std::cout << s.gibNamen() << " " << this->gibNamen() << '\n';
        }
    }
    
    bool Teilnehmer::kennt(Teilnehmer t) {
        bool vorhanden=0;
        for (int i=0; i<bekannte.size(); ++i) {
            if(bekannte[i].gibNamen()==t.gibNamen()) {
                vorhanden=1;
                break;
            }
        }
        return vorhanden;
    }
    

    teilnehmer.h

    #ifndef TEILNEHMER_H
    #define TEILNEHMER_H
    #include <vector>
    #include <string>
    
    class Teilnehmer {
    public:
        Teilnehmer(std::string n);
        std::string gibNamen();
        void druckeBekannte();
        void lerntKennen(Teilnehmer s);
        bool kennt(Teilnehmer t);
    private:
        std::string name;
        std::vector<Teilnehmer> bekannte;
    };
    
    #endif
    

    Danke im Voraus!



  • Du übergibst lerntKennen eine Kopie. Damit veränderst du zwar die Kopie, auf das ursprüngliche Objekt hat das allerdings keinen Einfluss -> Referenz



  • Problematisch ist auch, dass du alle Teilnehmer (TN) in einem Vektor als Kopie speicherst (in teilnehmer.h). Denke daran, dass ein Objekt eine Identität hat. Wenn du zwei TN abspeicherst, mögen die gleich sein, sind aber nicht identisch. Es ist nicht sinnvoll, dass jeder TN eine Kopie aller anderen bekannten TN speichert. Deswegen lieber Verweise abspeichern. Oder nur die Namen (mit dem Problem, dass es zwei TN mit demselben Namen geben könnte). Oder du vergibst eine eindeutige Id-Nummer.



  • Hat geklappt, danke!

    void Teilnehmer::lerntKennen(Teilnehmer& s) {
        if(name!=s.gibNamen() && !kennt(s)) {
            bekannte.push_back(s);
            s.lerntKennen(*this);
        }
    }
    


  • bool vorhanden = 0;
    

    sieht nicht schön aus. vorhanden=1 auch nicht. Mal true und false probieren!


Log in to reply