[C++] Pass by reference vanuit functie die PBR gebruikt

Pagina: 1
Acties:

  • 0rbit
  • Registratie: Maart 2000
  • Laatst online: 18-03-2021
Ik loop tegen een (denk ik redelijk triviaal) probleem aan waar ik geen oplossing voor heb kunnen vinden op zowel Google als GoT. Het gaat om het volgende probleem in C++.

Stel ik heb een tweetal functies die beide hun parameters by reference doorgeven. Gegeven bijvoorbeeld de volgende (fictieve) functies:

code:
1
2
3
void Add(int & x, int & y) {
    x += y;
}


Stel nu dat ik een andere functie heb waarin ik bovenstaande functie gebruik:

code:
1
2
3
4
5
void DoIets(int & x, int & y) {
     ...
     Add(x,y)
     ...
}


Mijn compiler geeft hierop een error en ik denk dat ik snap waarom. x is al een reference en geen int. Bij het aanroepen van Add pass je dus eigenlijk een reference naar een reference en dat is niet wat de compiler verwacht op grond van de definitie van de functie Add.

Een mogelijke oplossing is natuurlijk om Add niet langer de parameters als pass-by-reference door te geven, echter Add wordt ook buiten DoIets aangeroepen en omwille van efficientie is het geen mogelijkeheid om eerst een lokale kopie van de data te maken (door dus niet meer de reference te passen, maar het object zelf...).

Een andere oplossing zou zijn om de code van Add over te nemen in DoIets, maar dat is om wille van de modulariteit in mijn geval niet direct gewenst.

Is er een mogelijkheid de functie Add binnen DoIets aan te roepen waarbij de parameters alsnog als reference gepassed worden? Het is voor de snelheid van de code aboluut van groot belang. Of doe ik in dit geval beter een pass by pointer?

Ik ben geheel voldaan, dank u wel!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 07:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mr_Atheist schreef op vrijdag 13 april 2007 @ 12:42:
Mijn compiler geeft hierop een error en ik denk dat ik snap waarom. x is al een reference en geen int. Bij het aanroepen van Add pass je dus eigenlijk een reference naar een reference en dat is niet wat de compiler verwacht op grond van de definitie van de functie Add.
Dit klopt niet. Het gedeclareerde type van x is idd een reference, maar x wordt gewoon behandeld als elke andere int die je definieert (typeid(int&) == typeid(int)). Daarnaast worden references naar references gecollapsed, dwz, dit is geldige code:
C++:
1
2
3
4
typedef int& intref;
int a;
intref  r1 = a;  // r1 is int&
intref& r2 = a;  // r2 is int&


En dit natuurlijk ook:
C++:
1
2
3
int a;
int& r1 = a;
int& r2 = r1;  // niet een reference naar een reference oid, zowel r1 als r2 zijn een alias voor a


Ik snap dan ook niet waarom je compiler klaagt, je voorbeeld is iig gewoon legale C++. Wat is de fout en wat was de exacte code?

[ Voor 10% gewijzigd door .oisyn op 13-04-2007 13:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • 0rbit
  • Registratie: Maart 2000
  • Laatst online: 18-03-2021
Dat references gecollapsed worden wist ik niet. Dat is handig om te weten.

Ik heb de oplossing gevonden en snap nu waarom ik er niks over kon vinden :+ Het probleem was dat ik de referentie per ongeluk naar een variabele ander (qua naam zeer gelijkend) type liet verwijzen en ja, dan werkt dat collapsen natuurlijk niet :)

In mijn applicatie worden op vrij grote beelden vrij veel kleine operaties uitgevoerd. In zo'n geval wil je natuurlijk niet eerst een kopie maken van het beeld, omdat dit langer zou duren dan het uitvoeren van de operatie zelf.

Bedankt voor de hulp!

Ik ben geheel voldaan, dank u wel!