Archief - [PROG][C++] Typecasting, tijdelijke variabelen en call by (constant) reference

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

forloRn_

Legacy Member
Als je een variabele typecast dan wordt er een tijdelijke variabele aangemaakt, niet? Die tijdelijke variabele, is die constant (const)?

In mijn boek vind ik het volgende:
Actual arguments must be type-compatible with the formal arguments, without the use of a typecast. This is required because a typecast generates a temporary variable and that temporary variable would become the actual argument. Then changes to the formal parameter in the invoked function would change the temporary variable (instead of the original), leading to hard-to-find bugs.

Dat klinkt logisch, maar ik slaag er niet in het volgende te compileren (bij wijze van test):
Code:
#include <iostream>
using namespace std;

class Persoon {
	public:
		Persoon(const string &n): naam(n) {
		}
		
		string naam;
};

class Student: public Persoon {
	public:
		Student(const string &n): Persoon(n) {
		}
};

void veranderNaam(Persoon &p, const string &n) {
	p.naam = n;
}

int main() {
	Student s("Fred");
	veranderNaam((Persoon)s, "Mark");

	cout << "Naam: " << s.naam << endl;

	return EXIT_SUCCESS;
}

Reactie van de compiler:
../main.cpp: In function `int main()':
../main.cpp:24: error: invalid initialization of non-const reference of type 'Persoon&' from a temporary of type 'Persoon'
../main.cpp:18: error: in passing argument 1 of `void veranderNaam(Persoon&, const std::string&)'
mingw32-make.exe: *** [main.o] Error 1

De code slaat op niets, dat weet ik, ik wilde gewoon eventjes een tijdelijke variabele maken.

Waarom compileert dit niet?

killgore

Legacy Member
compilet perfect bij mij.

Alleja, kmoest #include <string> toevoegen om met << vo cout te werken, ma that's it.

edit: kzal ook isop mingw bezien, dit was in vc++.

edit2: alsek fout goe interpreteer wilt em u juist waarschuwen voor die moeilijk te debuggen fout die het boek vermeld :).

Tyfius

Legacy Member
Ik heb die error nochtans ook.

Code:
jensen@atlantis ~/test $ g++ test.cpp
test.cpp: In function `int main()':
test.cpp:25: error: invalid initialization of non-const reference of type '
   Persoon&' from a temporary of type 'Persoon'
test.cpp:19: error: in passing argument 1 of `void veranderNaam(Persoon&, const
   std::string&)'

forloRn_

Legacy Member
Als het toegelaten was maar mogelijk gevaarlijk, zou hij een warning geven in plaats van een error.

Als je typecast weglaat, is er geen enkel probleem. Ik vraag me gewoon af waarom hij moeilijk doet als je effectief cast. Is het omdat je na het casten een const Persoon bekomt en de methode veranderNaam() die Persoon in theorie mag veranderen, of heeft het een andere reden?

QplQyer

Legacy Member
Allicht voert hij bij die cast de constructor van Persoon uit om die cast te doen. En omdat hij in een functie-aanroep staat geeft hij dan een const ref terug, maar die functie neemt een gewone ref aan waardoor je in de miserie komt.

Dat is toch op wat het lijkt ...
De oplossing zal zijn om geen C-casts te gebruiken, maar een C++ cast-manier.


*edit2*: Got it, de copy-constructor wordt gebruikt bij die C-cast, dus je moet casten op de C++ manier allicht.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan