Zuweisungsoperator kann nicht erstellt werden? ?-)
-
Hi, der GCC 3.2 hat anscheinend Probleme, einen Zuweisungsoperator fuer folgende Klasse zu erstellen:
#include <list> using std::list; class Raindrop { public: Raindrop(const Vector2D& position, const Vector2D& movement, Surface::Color color, const Surface& surface); void move(); void changeSpeed(const Vector2D& newSpeed) {speed_ = newSpeed;} Vector2D getPosition() {return pos_;} Surface::Color getColor() {return color_;} void draw(); private: Vector2D pos_; Vector2D speed_; Surface::Color color_; Surface& surface_; struct RainTrail { Vector2D pos; Surface::Color color; RainTrail(const Vector2D& p,const Surface::Color& c) : pos(p), color(c) {} }; typedef list<RainTrail>::iterator TrailIterator; list<RainTrail> trails_; };
er meint dazu:
C:\Dev-Cpp\include\c++\bits\stl_vector.h In member function `Raindrop& Raindrop::operator=(const Raindrop&)': 893 C:\Dev-Cpp\include\c++\bits\stl_vector.h instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<_Tp*, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Raindrop, _Alloc = std::allocator<Raindrop>]' 496 C:\Dev-Cpp\include\c++\bits\stl_vector.h instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Raindrop, _Alloc = std::allocator<Raindrop>]' 125 E:\works\coding\cpp\Rain\src\RainSimulation.cpp instantiated from here 893 C:\Dev-Cpp\include\c++\bits\stl_vector.h non-static reference member ` Surface&Raindrop::surface_', can't use default assignment operator
das "instantiated form here" bezieht sich auf die letzte Zeile in folgender Funktion:
void RainSimulation::createDrops() { Vector2D pos; Vector2D speed; Surface::Color color(0, 0, 255); for (int i = 0; i < newDropsRate_; ++i) { pos.setX((rand() % (surface_.getWidth() - BORDER_ * 2)) + BORDER_); speed.setX(generateRandom()); speed.setY(generatePositiveRandom()); drops_.push_back(Raindrop(pos, speed, color, surface_)); } }
wobei drops_ ein std::vector ist... Ich versteh den Fehler leider nicht
-
das liegt hier ran:
Surface& surface_;
Wenn du eine Referenz als Member hast, kann kein Compiler einen Zuweisungsoperator erstellen.
-
Thx a lot
aber dumme Frage: wieso nicht? er muesste ja einfach nur die Referenz kopieren
-
Und Referenzen kann man nicht kopieren. Die werden nur beim konstruieren einmal zugewiesen und sind danach unveränderlich.
Eine andere Möglichkeit wäre das referenzierte Objekt zu kopieren. Aber das scheint er wohl nicht zu tun.
-
Zum Glück, das würde man ja auch nicht unbedingt erwarten.
Also einfach nen Zeiger nehmen.