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
mitfreunde.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 kannvoid 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
-
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 einfachset <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)
- Der grösste, gültige Index ist size()-1 und nicht size(), also nimm < und nicht <=
- Du vergleichst einen Zeiger mit einem dereferenziertem Zeiger.
Da du keinen ==-Operator hast, wirst du wohl 'if(freunde[i] != x)' wollen.