Operand muss L-Value sein?
-
Moin, Moin....
hab kleines Problem mit folgendem Code:
bool ParticleSystem::addParticle(Particle particle) { Particle* new_particle = new Particle(); *new_particle = particle; new_particle->next() = m_headparticle; // <== "Linker Operand muss ein L-Wert sein" m_headparticle = new_particle; return true; }
Particle sieht so aus:
class Particle { public: Particle(); Particle(const Vector2D& position, const Vector2D& velocity, const Vector2D& acceleration, const Color& particle_color); void move() {pos += (vel += acc);} // getter const Vector2D& getPos() const {return pos;} int x() const {return static_cast<int>(pos.x());} int y() const {return static_cast<int>(pos.y());} long getAge() const {return age;} const Color& getColor() const {return color;} // setter and getter Vector2D& acceleration() {return acc;} Particle* next() {return m_next;} // <== da ist next() private: Vector2D pos; Vector2D vel; Vector2D acc; long age; // age (in movement-cycles) Color color; Particle* m_next; // to create linked lists };
Hmm... jo, hier steh ich nun, und hab keine Ahnung was genau das Problem des Compilers ist, auch weil ich mit dem Begriff L-Value nicht viel anfangen kann... Und Stroustrups Erklaerung "ein Objekt ist ein zusammenhaengender Bereich Speicher, und ein lvalue ist ein Ausdruck, der ein Objekt referenziert" klingt zwar soweit verstaendlich, nur verstehe ich nicht ganz was das mit meinem Compiler-Fehler zu tun hat...
particles->next() liefert einen Pointer auf einen anderen Particle, was IMO sehr wohl ein Objekt im Speicher referenziert, und somit ja auch ein L-Value ist, oder?
-
ein L-Wert (lvalue) ist ein Wert, der auf der Linken Seite einer Zuweisung stehen darf:
int a, b = 2; a = 25 * b; // ok, a ist ein lvalue 25 * b = a; // mööp, 25*b ist ein rvalue, kein lvalue
-
Du lieferst eine Kopie des Pointers zurück, diese ist temporär und daher kein lvalue. Du mußt den Zeiger per Referenz zurückgeben:
Particle* & next() {return m_next;}
-
EDIT: thx a lot Jester
(irgendwie kommts mir komisch vor, eine Referenz auf einen Pointer zurueckzugeben... ^^ )
-
oder ParticleSystem zum friend machen und direkt auf m_next gehen, oder eine Memberfunktion set_next() bereitstellen.
-
Bashar schrieb:
oder ParticleSystem zum friend machen und direkt auf m_next gehen, oder eine Memberfunktion set_next() bereitstellen.
friend wollt ich nicht, und der Syntax passt mir so besser