Klassen



  • ich hab eine class mit dem namen "Person" erstellt
    hier ein ausschnitt:

    class Person
    {
    private:
        Anschrift anschrift;
        string _name ;
        vector <Person*> freunde;
    
    public:
        void befreunden(Person *x)
        {	
    		Person p=*x,y;
    		y._name = (this -> _name);
    		y.anschrift = (this -> anschrift);
    		freunde.push_back(x); 		//x,
    		p.freunde.push_back(&y);
    		x -> &p;
    		cout <<"test" << endl;
        }
    

    in meiner main datei möchte ich nun das machen:

    daniel.befreunden(&donald);
    

    wobei daniel und donald jeweils Personen sind.
    ich möchte das sich beide gegenseitig befreunden. meine befreunden funktion ist falsch jedoch bekomm ich nicht die lösung für mein problem
    mit

    freunde.push_back(x);
    

    schaff ich es die adresse von donald abzuspreichern in daniel , wie speicher ich jedoch jetzt die adresse von daniel in donald ab??



  • x->freunde.push_back(this);
    


  • kaum ist ein problem gelöst kommt das nächste ^^
    ich möchte jetzt das es keine mehrfachbefreundungen mehr gibt, sprich das man eine person nur einmal in den vector speichern kann

    void befreunden(Person *x)
        {
            for(int i=0; i<=freunde.size(); i++)
            {
                if(freunde[i] != *x)
                    freunde.push_back(x);
    
                x->freunde.push_back(this);
            }
        }
    

    aber wie kann es anders sein , meine idee geht nicht 🙂
    zum einen mag er meine for schleife nicht so wirklich , zum anderen mein if vergleich


  • Mod

    Nimm doch ein set statt vector, das passt besser zu dem, was du modellieren möchtest. Oder gibt es irgendeine feste Reihenfolge der Freunde?



  • ne gibt keine feste reihenfolge , jedoch weiss ich nicht was mit set jetzt genau meinst 🙂 . es wäre noch recht interessant zu wissen warum das so nicht geht wie ich es habe . was ist den an

    for(int i=0; i<=freunde.size(); i++)
    

    falsch?

    für mich heist das i geht bei 0 los , so falls jetzt noch kein freund vorhanden ist , dann müsste doch freunde.zize() mir ne 0 liefern oder? falls ja geht er weiter zum if . im vector ist ja ein zeiger eingespeichert und den will ich mit *x vergleichen . naja und falls die ungleich sind soll er dann x in den vector speichern. hört sich für mich wie gesagt logisch an 🙂



  • "geht nicht" - sehr aussagekräftig



  • SeppJ meint, dass du statt

    vector <Person*> freunde;
    

    besser

    set <Person*> freunde;
    

    bzw. gleich

    unordered_set <Person*> freunde;
    

    verwenden solltest.
    Hierbei heißt das 'push_back' aber 'insert'.

    Was willst du eigentlich mit den Zeigern bzw. Adressen erreichen?
    Für sowas gibt es in C++ Referenzen.
    Dann hieße es in der Klasse einfach

    set <Person> freunde;
    und auch einfach
    daniel.befreunden(donald);
    statt
    daniel.befreunden(&donald);
    


  • das mit dem zeiger hat den grund , dass die person eigenschaften hat (anschrift , alter ) die sich ändern können .falls die sich ändern würden muss das ja auch bei der in den vector freunde gespeicherten person gelten . gibts den keine möglichkeit das mit einem vector zu machen ?



  • Hallo,
    dass das alles nicht unbedingt optimal ist, wurde ja schon erwähnt.
    Zu deinen Fehlern (die du verschweigst und daher länger warten musst):

    for(int i=0; i<=freunde.size(); i++)
      if(freunde[i] != *x)
    
    1. Der grösste, gültige Index ist size()-1 und nicht size(), also nimm < und nicht <=
    2. Du vergleichst einen Zeiger mit einem dereferenziertem Zeiger.
      Da du keinen ==-Operator hast, wirst du wohl 'if(freunde[i] != x)' wollen.

Anmelden zum Antworten