Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
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

zum Seitenanfang zum Seitenende Profil || Suche
001
28.10.2002, 16:02
CN



in php zum beispiel wird damit ein element aus einem objekt aufgerufen (also $object->var)
ähnlich wie [] bei arrays ($array[0])
aber du solltest schon sagen in welchem zusammen hang du das gesehen hast

--


Dieser Beitrag wurde am 28.10.2002 um 16:08 von CN bearbeitet.
zum Seitenanfang zum Seitenende 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
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende 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,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende Profil || Suche
007
28.10.2002, 17:52
Kriz



Genau die Zweite:

CKlasse* pKlasse;
pKlasse->MethodeXYZ();

bzw. normal

CKlasse klasse;
klasse.MethodeXYZ();

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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
008
28.10.2002, 18:18
Mazze



CKlasse *ck;

ck->f();
ist praktisch ne Abkürzung für:
(*ck).f();

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende 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:
Entweder, du lädst in die Variable eine Klasse (bitte nicht am Syntax stören) und machst folgendes:

CKlasse Objekt;
Objekt.Methode();
Objekt.szPublicVariable = "gnarf";

Dann gibt es dazu die Möglichkeit, eben noch einen Zeiger auf dieses Objekt zu zeigen:

CKlasse * pObjekt;
pObjekt = &Objekt;

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;
pObjekt = new CKlasse( KonstruktorParams );
pObjekt->Methode();
pObjekt->szPublicVariable = "gnarf";
delete pObjekt;
pObjekt = NULL;

Das "->" ist also im Grunde nur eine Abkürzung für die recht komplizierte Form

(*Objekt).Methode();
(*Objekt).szPublicVariable = "gnarf";

Hier wird eben einfach nur der Zeiger, wie oben schon beschrieben erst dereferenziert (mit dem *) und dann wird auf das Objekt zugegriffen.
Recht simpel ansich, nicht wahr?

p.s.: Wenn das Mist ist, was ich geschrieben habe, bitte korrigieren.

--

zum Seitenanfang zum Seitenende Profil || Suche
010
29.10.2002, 10:19
CorDharel



Jea thx für die Hilfe.

Aber wenn ich

CKlasse * pObjekt;
pObjekt = &Objekt;

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.
zum Seitenanfang zum Seitenende 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.)

--

zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende 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:

Quellcode:/*** Assiges Schafsprogramm ***/
#include <iostream.h>
#include "schafe.h" // Hier ist die Headerdatei der Klasse CSchaf
int main()
{
    CSchaf* pSchaf = NULL; // Zeiger auf CSchaf erzeugen
    int schafe; // Anzahl der zu erzeugenden Schafe
    cout << "Wieviel Schafe erzeugen? ";
    cin >> schafe;
    if(schafe<1) // prüfen, ob mind. 1 Schaf angegeben worden ist
    {
        cerr << "\n\n\aDu Schafskopf!";
        return 1; // Und feddich...
    }
    else
    {
        pSchaf = new CSchaf[schafe+1]; // Array mit n+1 Schafen erzeugen
        pSchaf[n].setName("Harald"); // Letztes Schaf benennen
        pSchaf[n].setAlter(100); // Letztes Schaf mit Alter versehen
        cout << "\n\nDas letzte Schaf hieß " // Ausgaben
             << pSchaf[n].getName()
             << "\nund das war "
             << pSchaf[n].getAlter();
             << " Jahr' alt..."
             << endl;
        delete pSchaf; // Schafsarray löschen
        pSchaf = NULL; // Auf NULL zeigen lassen
    }
    return 0;
}

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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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.

Zitat:
In dem Fall des Zeigers ist es dem Computer egal, wieviele Schafe noch kommen, denn in der Klasse reserviert der Computer nur den Speicherplatz, der für die Adresse benutzt wird.

Das ist mal ein hilfreicher Satz!

Zitat:
Strukturen, Unionen und Klassenobjekten

Ö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.
zum Seitenanfang zum Seitenende 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:

Quellcode:typedef union
{
    char cTest;
    int iTest;
} my_union_t;

int main()
{
    my_union_t muMyUnion.cTest = 0;

    muMyUnion.iTest = 233 | (155 << 8);
    printf("muMyUnion.cTest = %i\n", (int) muMyUnion.cTest);
}

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.
zum Seitenanfang zum Seitenende 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...

--

zum Seitenanfang zum Seitenende 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
Quellcode:muMyUnion.iTest = 233 | (155 << 8);
?

Übrigens: thx2all4thegoodanswers!

--

Greetz CorDharel

Leader der HolyShitBastards

zum Seitenanfang zum Seitenende 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.

--

zum Seitenanfang zum Seitenende Profil || Suche
020
31.10.2002, 14:06
Mazze



Alle Variablen etc. in einer Union starten bei der gleichen Adresse.
Am besten lässt sich das durch ein Bsp erklären:
Quellcode:
union un
{
    int a;
    char ch;
    double d;
    int r;
};

a und r ist praktisch das selbe.
Das heißt, wenn man a 100 zuweist, dann ist r auch 100.
ch ist in den Fall auch 100 und d ist undefiniert, da die restlichen 32 bit, die ein double mehr hat als ein int noch nicht definiert wurden.
Wenn man allerding für a 300 setzt ist r logischerweise immer noch gleich.
ch allerdings nicht mehr, da nur die ersten 8 bit von den 32 bit von a verwendet werden...schlecht ausgedrückt...versuchs mal mit ner ascii grafik:
300:
Quellcode:
... 0001 0010 1100
|            INT      |
            |  CHAR  |

(oh Gott ist das hässlich..)
d.h. in diesem Fall ist ch 0x2C ist dec 44, nicht 300

Eine Union ist logischerweise immer so groß wie ihre größte Variable.

[edit]
Meine coole grafik muss in code tags...

Ü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.
[/edit]

[edit2]
=p
klappt nicht.
Musst halt deine Fantasie ein bissschen anstrengen um das "Bild" zu verstehen...
[/edit2]
cu
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/


Dieser Beitrag wurde am 31.10.2002 um 14:11 von Mazze bearbeitet.
zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende Profil || Suche