.| Autor | Beitrag |
|---|---|
|
000 28.10.2002, 15:49 CorDharel |
Hi all! Kann mir bitte jemand erklären, was "->" bedeutet? Hab es schon mehrmals angetroffen, weiss aber nicht in welchem Zusammenhang man dieses benutzt. --Greetz CorDharel Leader der HolyShitBastards |
|
Profil || Suche |
|
001 28.10.2002, 16:02 CN |
in php zum beispiel wird damit ein element aus einem objekt aufgerufen (also $object->var) Dieser Beitrag wurde am 28.10.2002 um 16:08 von CN bearbeitet. |
|
Profil || Suche |
|
002 28.10.2002, 16:42 King of Darkness |
in c++ is das so das man damit ähhm wie soll ich sagen ok du hast einen pointer auf eine klassen und in der klasse ist eine variable oder funktion und die sprichtst du dann so an: klasse->funktion(); wenn du keinen pointer sondern eine variable auf eine klasse machst dann macht man das ja so: klasse.funktion(); mfg --Coding Center --- Tutorials über Programmierung und andere Themen |
|
Profil || Suche |
|
003 28.10.2002, 16:50 theDon |
member-dereferenzierung bei zeigern. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
004 28.10.2002, 16:51 CorDharel |
Oh dachte das gäbs nur in C++ 8-) das meine ich nämlich :) @KoD du meinst wenn ich einen Zeiger als Parameter übergebe nehme ich "->" um auf die Funktion zuzugreifen und wenn ich eine Variable übergebe nehme ich es nicht? --Greetz CorDharel Leader der HolyShitBastards |
|
Profil || Suche |
|
005 28.10.2002, 17:21 Kriz |
Genau: Der Punkt '.' ist der Zugriffsoperator auf Strukturen, Unionen und eben Klassenobjekten. Der Pfeil '->' ist der kombinierte Dereferenzierungs-Zugriffsoperator auf Strukturen, Unionen und Klassenobjekten, die als Zeigerform vorliegen. Dereferenzierung daher, weil ein Zeiger nur eine Adresse als Wert beinhaltet und man das hinter dieser Adresse liegende Objekt erst dereferenzieren muß, um an dessen Wert zu kommen. --K:R-I)Z++ |
|
Profil || Suche |
|
006 28.10.2002, 17:34 CorDharel |
Hmm ich hab nochmals über meinen Satz nachgedacht. Nimmt man "->" nicht wenn man das Objekt als Zeiger instantiert hat? Also etwa CAuto *Auto; ? --Greetz CorDharel Leader der HolyShitBastards |
|
Profil || Suche |
|
007 28.10.2002, 17:52 Kriz |
Genau die Zweite: CKlasse* pKlasse; bzw. normal CKlasse klasse; Der Unterschied bei Zeigern auf Klassenobjekten und normalen Klassenobjekten liegt darin, daß Zeiger auf Klassenobjekte tiefreichendere Auswirkungen haben können als normale Objekte. So können Klassenzeiger je nach Implementierung virtuell sein und somit genau die passenden Methoden aufrufen, die man im Zusammenhang mit diesem Klassenzeiger erwartet (was das jetzt bedeutet erkläre ich hier nicht, dafür muß man schon ne Menge Ahnung von der Objektorientierung in C++ haben). --K:R-I)Z++ |
|
Profil || Suche |
|
008 28.10.2002, 18:18 Mazze |
CKlasse *ck; ck->f(); BattleTech-MOD: |
|
Profil || Suche |
|
009 28.10.2002, 18:29 apfelkorn |
Mann kann auch das ganze ganz schön daran zeigen (*höhö*): Du hast zwei Möglichkeiten: CKlasse Objekt; Dann gibt es dazu die Möglichkeit, eben noch einen Zeiger auf dieses Objekt zu zeigen: CKlasse * pObjekt; Mit dem "&" wird referenziert, dass heisst hier: Der Variable pObjekt wird dann also die Speicheradresse des Objektes zugewiesen. oder in deine Variable lädst du nur den Zeiger auf das Objekt, auf das du gerne Zugreifen möchtest: CKlasse * pObjekt; Das "->" ist also im Grunde nur eine Abkürzung für die recht komplizierte Form (*Objekt).Methode(); Hier wird eben einfach nur der Zeiger, wie oben schon beschrieben erst dereferenziert (mit dem *) und dann wird auf das Objekt zugegriffen. p.s.: Wenn das Mist ist, was ich geschrieben habe, bitte korrigieren. -- |
|
Profil || Suche |
|
010 29.10.2002, 10:19 CorDharel |
Jea thx für die Hilfe. Aber wenn ich CKlasse * pObjekt; mache, für was kann ich dann z. Bsp. pObjekt benutzen? --Greetz CorDharel Leader der HolyShitBastards Dieser Beitrag wurde am 29.10.2002 um 10:19 von CorDharel bearbeitet. |
|
Profil || Suche |
|
011 29.10.2002, 10:58 Zeeke |
Wenn du z.B. dynamisch zur Laufzeit Schafe erstellst, und sie mit einer Linklist verwaltest, dann brauchst du einen Zeiger auf ein Objekt, um die zur Laufzeit erstellten Schafe ansprechen zu können. (Vielleicht nicht ganz richtig ausgedrückt.) -- |
|
Profil || Suche |
|
012 29.10.2002, 16:05 apfelkorn |
Oder du kannst eine Zeigerverkettete Liste (oder Zeigerverkettete Schafsherden) machen, in dem du ins Struct oder die Klasse eben einen Zeiger einbaust (CSchaf *pNextSchaf), der dann zur Laufzeit mit der Adresse des nächsten Schafes gefüllt wird oder eben NULL ist, wenn das letzte Schaf erreicht ist. Das geht eben nur per Zeiger und nicht per direktem "Objekt im Objekt", weil das eine rekursive (rekursiv bedeutet, das etwas sich besipielsweise selber aufruft) Klasse geben würde, und der Compiler wüsste nicht, wieviel Spiecherplatz er reservieren müsste. (Theoretisch unendlich viel Speicher, und soviel hat nun mal kein Computer) In dem Fall des Zeigers ist es dem Computer egal, wieviele Schafe noch kommen, denn in der Klasse reserviert der Computer nur den Spiecherplatz, der für die Adresse benutzt wird. --Dieser Beitrag wurde am 29.10.2002 um 16:11 von apfelkorn bearbeitet. |
|
Profil || Suche |
|
013 30.10.2002, 09:14 CorDharel |
Hmm Ihr wisst schon dass das nicht der Thread mit den Schafen ist oder? :) Aber *pNextSchaf ist doch ein Zeiger auf ein Objekt, warum kann der die Adresse eines Schafes annehmen? Müsste man da nicht einen Zeiger in der Klasse definieren, der dann die Adresse des nächsten Schafes besitzt? Je länger ich diesen Thread durchlese desto verwirrter bin ich :D --Greetz CorDharel Leader der HolyShitBastards |
|
Profil || Suche |
|
014 30.10.2002, 11:10 Kriz |
Fangen wir mal bei Adam und Eva an, hrhrhr: Angenommen, du möchtest in einem kleinen, assiges Scheißprogramm dem Benutzer überlassen, wieviele Schafe er erzeugen will. Dafür braucht man ein dynamisches Array. Alle Arrays in C/C++ sind implizite Zeiger, die per Zeigerarithmetik gesteuert werden. Das Programm erzeugt dann n Schafe:
Das ist nur ein Beispiel für Zeiger auf Objekte. Andere Dinge sind klassische Datenstrukturen wie Verkettete Listen, Doppelt verkettete Listen, Schlangen, Warteschlangen, Prioritäts-Warteschlangen usw. Ein Zeiger auf ein Objekt ist im Prinzip nichts anderes als ein "Hinweis", daß irgendwo im Speicher ein noch "unfertiges" Objekt erzeugt worden ist, daß man entweder als Adressen-Akkumulator nehmen kann oder aus dem man eben ein richtiges, fertiges Objekt alloziieren kann bzw. ein Array von Objekten. Zeiger sind auch wichtig, wenn man innerhalb von Funktionen einen übergebenen Wert verändern möchte usw. Zeiger sind einfach wichtig! --K:R-I)Z++ |
|
Profil || Suche |
|
015 30.10.2002, 13:14 CorDharel |
Pff ich habs kapiert, wenn man weiss wieviele Schafe man braucht > keinen Zeiger, wenn man die Anzahl dynamisch herausfinden muss > Zeiger.
Das ist mal ein hilfreicher Satz!
Öhm was ist ne Union? ?( Und den Typen der diesen Schafthread erstellt hat sollte man anzeigen... :P --Greetz CorDharel Leader der HolyShitBastards Dieser Beitrag wurde am 30.10.2002 um 13:14 von CorDharel bearbeitet. |
|
Profil || Suche |
|
016 30.10.2002, 14:29 [RMen]OneStone |
Also, eine Union ist eine Struct, bei der alle Variablen an der gleichen Speicherstelle liegen:
Ausgabe: muMyUnion.cTest = 233 BTW: abc->def ist das selbe wie abc[0].def --georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/ Dieser Beitrag wurde am 30.10.2002 um 14:29 von [RMen]OneStone bearbeitet. |
|
Profil || Suche |
|
017 30.10.2002, 23:53 apfelkorn |
mit den unions muss man aber vorallem als anfänger vorsichtig sein, denn da kann man eine menge Müll fabrizieren... -- |
|
Profil || Suche |
|
018 31.10.2002, 09:17 CorDharel |
Was bringt das denn wenn die Variabeln alle an gleicher Stelle liegen? Und was genau macht Übrigens: thx2all4thegoodanswers! --Greetz CorDharel Leader der HolyShitBastards |
|
Profil || Suche |
|
019 31.10.2002, 13:31 apfelkorn |
mh, ein einfaches beispiel sind Strukturen für "Mehrzweckvariablen". Du kannst so zum Beispiel an eine Stelle im Speicher Platz reservieren, der entweder einen double, einen int oder char aufnimmt, je nachdem, was gefordert wird, und so muss du nicht in ein struct 3 verschiedene datentypen einbauen, die nur unnötig speicher verbrauchen. -- |
|
Profil || Suche |
|
020 31.10.2002, 14:06 Mazze |
Alle Variablen etc. in einer Union starten bei der gleichen Adresse. (oh Gott ist das hässlich..) Eine Union ist logischerweise immer so groß wie ihre größte Variable. [edit] Übrigens verwende ich fast nie Unions und ich glaub auch andere Leute machen nicht allzuviel damit. Also falls es nicht so ganz einfach zu verstehen ist mach dich nicht verrückt...so wichtig ists nicht. [edit2] BattleTech-MOD: Dieser Beitrag wurde am 31.10.2002 um 14:11 von Mazze bearbeitet. |
|
Profil || Suche |
|
021 31.10.2002, 14:12 CorDharel |
Ah thx, dachte zuerst bei Unions sind die Variabeln alle an der gleichen Speicherstelle >hintereinander< definiert :) Lol und bei deiner Grafik kann ich mir in etwa vorstellen, was du uns sagen wolltest, aber auch nur mit Hilfe deines Textes ;) --Greetz CorDharel Leader der HolyShitBastards Dieser Beitrag wurde am 31.10.2002 um 14:13 von CorDharel bearbeitet. |
|
Profil || Suche |

