Archief - [PROG][C++] Return by 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
Iemand een idee waarom dit niet compileert? :confused:

De foutmelding:

../src/Entity.cpp: In member function ‘Position& Entity::getPosition() const’:
../src/Entity.cpp:17: error: invalid initialization of reference of type ‘Position&’ from expression of type ‘const Position’

Ik zeg nergens dat het attribuut position constant is, ik zeg enkel dat getPosition() het attribuut position niet zal wijzigen. :unsure:

Als ik return by constant reference gebruik, compileert het zonder problemen, maar het is wel de bedoeling dat ik de return value kan wijzigen, bijvoorbeeld met getPosition().setX(44).

Entity.h:
Code:
#ifndef ENTITY_H_
#define ENTITY_H_

#include "Position.h"
#include "Vector2D.h"

#include <iostream>
using namespace std;

class Entity {
	public:
		Entity(const string& newID, int xpos = 0, int ypos = 0, int zpos = 0);		// constructors
		
		const string& getID() const;				// getters
		Position& getPosition() const;
		
		void setPosition(Position& newPosition);	// setters
		
		
	private:
		string id;
		
		Position position;
};

#endif /*ENTITY_H_*/

Entity.cpp:
Code:
#include "Entity.h"
#include "Position.h"
#include "Vector2D.h"

#include <iostream>
using namespace std;

Entity::Entity(const string& newID, int xpos, int ypos, int zpos)
	:id(newID), position(xpos, ypos, zpos){
}

const string& Entity::getID() const {
	return id;
}

Position& Entity::getPosition() const {
	return position;
}

void Entity::setPosition(Position& newPosition) {
	position = newPosition;
}

Position.h:
Code:
#ifndef POSITION_H_
#define POSITION_H_

class Position {
	public:
		Position(int x0 = 0, int y0 = 0, int z0 = 0);
		
		int getX() const;
		int getY() const;
		int getZ() const;
		
		void setX(int x0);
		void setY(int y0);
		void setZ(int z0);
		
	private:
		int x, y, z;
};

#endif /*POSITION_H_*/

AcIdR3IgN

Legacy Member
mij C is nie zo goe.. maar ik zie toch overal const staan :| wat toch wil zeggen dat niks geweizigd wordt..?

Vich

Legacy Member
Doordat je die klasse-member const maakt op deze manier:
Position& Entity::getPosition() const {...}
Gaat hij die Position& ook const maken in die member.
Position& is een referentie naar iets in een const object, iets dat niet mag veranderen. Daarom maakt hij van Position& zélf "const Position&"

Je kan dit volgens mij enkel oplossen door dit te doen:
const Position& Entity::getPosition() const {...}
Want een normale referentie uit een const object doorgeven kan niet, dat is tegenstrijdig.

Als je per se toch dingen wil wijzigen in een const object, dan ga je const_cast moeten gebruiken om dit object eerst naar een niet-const object te casten.
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