Hjælp mig til at forstå pointers i C++ .... please?

Tags:    c++

<< < 12 > >>
ok jeg har flere gange prøvet at forstå pointere men har opgivet...
jeg tror jeg forstår idéen med det, men jeg fatter ikke hvordan det på nogen måde kan være nyttigt :S
jeg ser det som at lave en kopi af et variabel, hvilket jeg ikke kan se nogen mening i...

anyway, sådan her har jeg forstået det:
hvis jeg har et variabel 'i' og giver det en værdi af 10 fx.
så laver jeg så en pointer til i... lad os kalde den for pI.
nu "pejer" pI på i, right?
hvilket vil svare lidt til at ligge en genvej ud på sit skrivebord, i den forstand at man ligger et ikon ud på skrivebordet som så holder adressen til den oprindelige fil, som genvejen peger på?
eller har jeg misforstået noget?

og selv hvis det er rigtig (hvilket jeg tvivler lidt på), kan jeg ikke se hvordan det skal komme mig til nytte, hvis de alligevel har den samme værdi? :S

kunne en af jer kloge mennesker ikke give mig et eksempel? ikke bare et eksempel hvor en pointer bliver brugt (dem har jeg set massere af), men et eksempel hvor det rent faktisk er nødvendigt at bruge en pointer.
altså noget der kan give mig en idé om hvad pointere fx. kunne bruges til, udover at lave kopier af sine allerede eksisterende variabler ...

desuden fatter jeg ikke helt hvornår '*' skal være foran eller bagved variablet, og hvornår '&' skal bruges.

og så har jeg et spørgsmål med hensyn til en klasse jeg arbejder lidt på:

da jeg prøvede at lave et objekt af min klasse gjorde jeg bare sådan her:

menuItem test = new menuItem("test", true, 't');

og det gav mig følgende fejl:

error C2440: 'initializing' : cannot convert from 'menuItem *' to 'menuItem'

jeg kunne jo se at det havde noget med pointere at gøre, så jeg prøvede at sætte et '*' tegn ind lidt forskellige stedder i linjen, og endte op med følgende som virkede helt fint:

menuItem* test = new menuItem("test", true, 't');

hvorfor er det lige at jeg skal lave en pointer til min klasse for at lave et objekt? :S
det forstår jeg ikke helt :S


og for at i ikke skal køre helt træt i dumme spørgsmål om pointers, har jeg et lille bonusspørgsmål :P

hvordan kan jeg loope igennem alle objekter i en klasse, og så udføre et eller andet, for hvert objekt?
jeg prøvede med følgende, men det virkede ikke:

for each(object i in menuItem){ ... }

kan i hjælpe mig der?

på forhånd tak :D

-Craksy





Nogle årsager til brug af pointers.

En pointers er fylder meget lidt. 4 byte på en 32bit maskine. Og 8 byte på en 64 bit maskine vil jeg tro.

Men et objekt eller en datastruktur kan fylde mange bytes. Derfor er det meget nemmere at sætte en pointer til at pege på et stort datastruktur. Det er vist nok osse den eneste måde at passere objekter som argumenter.

F.eks.

Fold kodeboks ind/udKode 


Den ovenstående kode bruger pass-by-value som kopierer værdien a. Her kan man os bruge pass-by-reference som er med '&'.

Men hvis man nu har en mangebyte datastruktur som en klasse f.eks. er det meget performance-spild at kopiere hele objektet.

Fold kodeboks ind/udKode 


Dette er en pass-by-pointer. Her sættes pObjekt som en pointer til et MitObjekt instans.

Dette er bare en af årsagerne til pointers.

Årsagen til at man ikke kan dynamisk (efter programmet er startet) lave nye instanser af klasser er fordi ved statisk, når du ikke bruger nøgleordet 'new' kan compileren på forhånd bestemme hvor i hukommelsen dette objekt vil være. Men når det sker dynamisk laver den objekt ud fra hukommelsen fra freestore eller 'the heap'. Dette er sådant set bare fra ens ram osse. Men her kan compileren ikke på forhånd vide præcis hvad adresse objektet er på. Men en pointer er jo en adresse på noget. Så derfor bruger man pointers i kombination med 'new'.



Indlæg senest redigeret d. 19.03.2009 18:07 af Bruger #14645
nope... igen fatter jeg ikke en brik :$

kan stadig ikke se hvad idéen i pointers er :/



Øh på din profilside står der at du arbejder med DirectX SDK'en.. Så må du da have erfaring med pointers? Eller gør du det i managed?



bruger en engine, der er rimlig idiot sikker :P
meget nem at arbejde med, og den smule pointers der er, er lige til at overskue :P

hvis jeg på nogen måde får det til at lyde som om at jeg er god til programmering, så skal jeg have den side rettet :P



Du er selv inde på sammenligningen med genveje i windåsen, så den kører jeg videre med.
Hvorfor er genveje smarte ?
Fordi man så kan have tilgang til f.eks. Word uden at have hele skidtet installeret både i 'quick launch', Start menuen og på skrivebordet - og hvor man ellers kunne have lyst til at ha' en genvej. Hvis man skulle Kopiere hele Word til hvert sted ville det fylde... meget...

pointers er samme princip. istedet for at kopiere hele skidtet rundt, peger man bare på det man allerede har.

(Nu er det lang tid siden jeg har leget med pointer, så håber ikke jeg har sagt noget forkert... hej .NET :P)



så jeg var inde på noget af det rigtige med windows genveje :D
tror jeg forstår det bedre nu...
så der er faktisk ikke nogen situationer hvor pointere er et "must"... det er simpelthen bare noget der gør programmet hurtigere ved at genbruge sine allerede eksisterende funktioner?

men hvordan kan det forklare at jeg får fejl, hvis jeg prøver at lave et objekt uden en pointer?
hvis det bare er for at gøre ting hurtigere, burde det ikke være nødvendigt at bruge en pointer til at referere til min klasse?

og med hensyns til mit bonusspørgsmål: hvordan looper jeg igennem alle objekter af en bestemt klasse? :P

på forhånd tak :D




men hvordan kan det forklare at jeg får fejl, hvis jeg prøver at lave et objekt uden en pointer?
hvis det bare er for at gøre ting hurtigere, burde det ikke være nødvendigt at bruge en pointer til at referere til min klasse?


Bruger du nøgleordet 'new' ?

F.eks.

Myobject tralalal = new Myobject();



Indlæg senest redigeret d. 19.03.2009 20:41 af Bruger #14645
ja... skal man ikke det, når man laver et objekt fra en constructor?



ja... skal man ikke det, når man laver et objekt fra en constructor?


Ikke nødvendigvis.

Når du skriver

int a = 10;

f.eks. kan compileren regne ud hvor i hukommelsen 'a' kommer til at være. (f.eks. START_AF_PROGRAM + 120 BYTES, tamt eksempel)

Det samme kan den med:

Myobject test = Myobject(CONSTRUCTOR_ARGUMENTS);

Her kan den også regne ud hvor i hukommelsen relativ til programmets start 'test' er.

Men nøgleordet 'new' sørger for der først bliver allokeret hukommelse når du når til det sted i programmet, dette kaldes dynamisk allokation. Eksemplet i starten kaldes vist nok statisk allokation.

Eks.

Fold kodeboks ind/udKode 


Her er hukommelse for a, b, str, c, d, e allerede blevet allokeret selvom du ikke er nået der til i nu i programmet kørsel. Men 'test' er ikke blevet allokeret før programmet når der til.

Så compileren kan ikke regne ud i forvejen hvor 'test' kommer til at være i din computers hukommelse. Her er det pointers kommer ind. De holder jo som du ved en adresse i stedet for en værdi.

Så skriver man:

Myobject* test = new Myobject(NOGET);

Det der sker med 'new' er den ber operativsystemet om noget hukommelse og så giver den startadressen på den mængde hukommelse til 'test'.

Er ikke helt sikker på at de tekniske ting jeg har skrevet er fuldstændig korrekt men det er hvertfald noget i den stil!

Så nej du behøver ikke 'new' for at lave et objekt. Du kan gøre det ligesom du ville for 'int' f.eks.. Bare husk at ikke bruge 'new' så.

Hjalp det lidt?




Indlæg senest redigeret d. 19.03.2009 21:07 af Bruger #14645
ja det hjalp meget :D
nu har jeg sådan, mere eller mindre, forstået det med pointers! og jeg har forstået hvad keywordet 'new' egentlig betyder, samtidig med at jeg har lært en del om, hvordan C++/computeren arbejder med hukommelse :D
kort sagt: det har været meget lærerigt :P

nu mangler jeg bare at finde ud af hvordan man looper igennem alle objekter af en klasse... det ville være super fedt hvis i kunne hjælpe mig med den også :)
som sagt har jeg prøvet:
for each(object i in myClass){ ... }
men det virkede ikke :/

men tak for hjælpen indtil videre alle sammen :D
håber at i også lige kan hjælpe mig med den sidste her :)



<< < 12 > >>
t