016
30.06.2003, 19:25 Uhr
virtual
Sexiest Bit alive (Operator)
|
Naja, wie gesagt Iteratoren benutzen das zB. Nehmen wir mal die std::map
C++: |
std::map<std::string, int> mapScores;
|
Um es ein weing Anschaulicher zu gestalten stellen wird und unter mapScores eine Map vor, die die Highscroes von den jeweiligen Benutzern zu einem Spiel speichert. Wie hoffentlich bekannt werden die einzelnen Spieler/Score Paare in einer std::map als ein sortierter Baum von std::pair Instanzen gespeichert. Dh man kann sich mapScores vorstellen als eine Ansammlung von Instanzen von
C++: |
std::pair<std::string, int>;
|
Ein std::pair hat zwei Komponenten, nämlich first und second. Wenn ich einen Pointer auf ein std::pair habe, kann ich also so den User/Punktzahl ausgeben:
C++: |
std::pair<std::string, int>* ppair; std::cout<<ppair->first<<" hat "<<ppair->second<<" Punkte."<<std::endl;
|
Nun wollen wir wissen, 1. Ob pablo schon mal gespielt hat 2. Welche Punbktzahl der hatte Der entsprechende Code sieht dann so aus:
C++: |
std::map<std::string, int>::const_iterator ppair = mapScores.find("Pablo"); if (mapScores.end() != ppair) { std::cout<<ppair->first<<" hat "<<ppair->second<<" Punkte."<<std::endl; }else { std::cout<<"Pablo hat noch nie gespielt"<<std::endl;
|
Genau hingeguckt? - dann hast Du gesehen, daß hier ppair plötzlich ein Iterator ist, welcher mit an Sicherheit grenzender Wahrscheinlichkeit bei keiner Implementierung ein normaler Pointer auf ein pair ist. Der Operator -> wird hier also so verwendet um den Benutzer zu ermöglichen, den Iterator wie ein Pointer auf das Objekt von Interesse einzusetzen. Genau kann auch mit dem Unären * verfahren werden. Generell kann man mit Den ->, unären * und unären & dem Benutzer ein anderes Objekt vorgauckeln, als tatsächlich existiert. Bitte mit Vorsicht und gebotenem Respekt anwenden, kann tief in die Hose gehen! -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |