Oprettet søn. d. 13. februar 2011 kl. 18:05:44

_NielsGM
_NielsGM (2.575 point. Point ude: 45)

Effekten af forskellige måder at oprette objekter

Hej eksperter!

Jeg er stødt ind i et interessant problem i forbindelse med pass-by-reference af objekter til en function, a la

func(obj &a);

Og jeg håber at I kan give mig lidt hjælp til at løse det.

I min kode angiver jeg ofte 3D koordinater som argumenter til funktioner, og for at gøre koden mere overskuelig har jeg defineret en klasse, Coord3D, som indeholder x,y og z, og har en constructor

Coord3D(double x, double y, double z){
this->x = x;
this->y = y;
this->z = z;
}

Funktioner med koordinater som parametre, kaldes da således:

SetGeometry(Coord3D(1,2,3),Coord3D(4,5,6),...);

Hvilket går godt så længe at funktionen er call-by-value:

void SetGeometry(Coord3D a, Coord3D b, ...);

Problemet opstår hvis jeg, i et forsøg på at optimere koden, ændrer SetGeometry() til call-by-reference i stedet.

void SetGeometry(Coord3D &a, Coord3D &b, ...);

Herefter vil g++ ikke længere godtage f.eks. Coord3D(1,2,3) som argument. Jeg kan ikke gennemskue hvorfor. Problemet har dog givet mig grund til at studse over hvad der helt præcist sker når jeg f.eks. angiver Coord3D(...) som et argument. I det hele taget vil jeg gerne vide hvad compileren gør ved følgende kode:

Coord3D(1,2,3);
Coord3D c(1,2,3);
Coord3D d = Coord3D(1,2,3);

Som compiler uden problemer. Ryger objekterne bare på stakken, og i givet fald, hvorfor godtages Coord3D(...) så ikke?

Håber at I kan give lidt input :-)

Hilsen Niels

Skrevet søn. d. 13. februar 2011 kl. 18:19:12| #1

bertelbrander
bertelbrander (17.270 point)
Mon ikke det virker hvis du laver parametrene const?
void SetGeometry(const Coord3D &a, const Coord3D &b)

Skrevet søn. d. 13. februar 2011 kl. 18:34:09| #2

bertelbrander
bertelbrander (17.270 point)
En lidt længere forklaring: Midlertidige objekter som man opretter i forbindelse med et kald af en funktion, er som udgangspunkt const. Det er sådan set logisk nok, tallene 1, 2, 3 i dit tilfælde er const, man kan ikke modificere dem. Man kan også sige at det ikke rigtigt giver mening at forsøge at modificere midlertidige objekter, hvis man vil modificere noget, må man oprette et objekt.
Disse midlertidige objekter bliver oprettet på stakken, og eksisterer kun så længe funktionskaldet varer.

Du nævner selv tre tilfælde:
Coord3D(1,2,3);
Her sker der (sandsynligvis) intet, der bliver ikke oprettet noget objekt.

Coord3D c(1,2,3);
Her bliver objektet c oprettet på normal vis, med kald til constructoren.

Coord3D d = Coord3D(1,2,3);
Umiddelbart ville man forvente at der blev oprettet et objekt på højreside, som man tog et kopi af, for at oprette d. Men i virkeligheden bliver d konstrueret på præcis samme måde som c ovenfor, så der er ingen forskelle på de to sidste eksempler.

Skrevet søn. d. 13. februar 2011 kl. 18:59:23| #3

_NielsGM
_NielsGM (2.575 point)
Mange tak for svaret!
At gøre parametrene const løste problemet.

Jeg forstår dog stadig ikke helt hvorfor det er nødvendigt med const. Selvom det oftest er meningsløst at ændre i et midlertidigt objekt, så burde der vel ikke være noget til hindring for at gøre det? Siden Coord3D(1,2,3) objektet jo nødvendigvis må blive lagt på stakken, hvorfor godtages det så ikke med mindre at parameteren er angivet som const?

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Updater Hybrid App

Oprettet den 18. april 2012 kl. 13.29
sir_madsen giver 100 point for svar | Giv et svar »

Ansi-c win32API - kan ikke oprette Richedit4.1 kontrol

Oprettet den 16. april 2012 kl. 22.13
cblcbl giver 60 point for svar | Giv et svar »

Iphone Objective C - Sætte image på et imageview.

Oprettet den 7. april 2012 kl. 11.36
lasserasch giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger