Dynamischer Array "="-Operator überschreiben
-
Hi,
ich stoße auf ein etwas seltsames Verhalten.
Und zwar scheint die Zuweisung über den "="-Operator nur teilweise zu funktionieren.Was ich habe:
struct vec2 { float x; float y; inline vec2( ) : x(0.0f), y(0.0f) { }; inline vec2(float px, float py) : x(px), y(py) { }; }class BendedLine { public: BendedLine() { m_numPoints = 0; m_pPoints = 0; } BendedLine(int numPoints, vec2* pPoints) { m_numPoints = numPoints; m_pPoints = pPoints; } ~BendedLine() { delete[] m_pPoints; } inline BendedLine operator=(BendedLine& rhs) { std::cout<<"=Operator: "; m_numPoints = rhs.m_numPoints; delete m_pPoints; m_pPoints = new vec2[m_numPoints]; for(int i = 0; i < m_numPoints; i++) { m_pPoints[i] = vec2(rhs.m_pPoints[i].x, rhs.m_pPoints[i].y); std::cout<<m_pPoints[i].x << " / " <<m_pPoints[i].y << ", "; } std::cout<<"\n"; return *this; } inline const int numPoints() const { return m_numPoints; } inline const vec2 get(int i) const { return m_pPoints[i]; } private: int m_numPoints; vec2* m_pPoints; };Soo, das ganze benutze ich nun:
vec2* point = new vec2[3]; point[0] = vec2(1,1); point[1] = vec2 (2,2); point[2] = vec2(3,3); BendedLine l1(3, point); BendedLine l2; l2 = l1; printLine(l1); printLine(l2);Als Ausgabe erhalte ich:
=Operator: 1,1 / 2,2 / 3,3
l1: 1,1 / 2,2 / 3,3
l2: x,y / 2,2 / 3,3Wobei x,y hier scheinbar zufällige, jedoch immer sehr kleine Zahlen sind.
(Z.B. 1.8013e-38)Wieso verhaut es mir die? Und wieso immer nur den ersten Vector?
-
Hi, mir ist gerade aufgefallen:
In dem "="-Operator muss es natürlich:
delete[] m_pPoints;
heißen.
Ändert an der Problematik aber nichts.
-
also auffällig ist das auch aus meiner sicht nicht.
zeig mal printLine...
du kannst in zeile 29 genauso gut schreiben:
m_pPoints[i] = rhs.m_pPoints[i];da du ja den vector kopierst
und übergib deine rhs als const&
-
@off topic:
Wirf die dynamische Speicherverwaltung raus und nimm statt dessen std::vector. Damit löst du dein Problem sofort, dafür möchte ich wetten.@on topic:
Der Zuweisungsoperator sieht erstmal gut aus, aber der Kopierkonstruktor fehlt. Nicht, dass du print per-value aufrufst und ein temporäres Objekt dir deinen Speicher wieder freigibt, ohne dass du es merkst.PS:
Gebogen heißt bent, nicht bended
-
DocShoe schrieb:
Der Zuweisungsoperator sieht erstmal gut aus,
Er verkraftet keine Selbstzuweisung.
Und sonst kann ich sagen: Verletzung der 3er-Regel (wurde aber schon genannt).
Und noch ein +1 für std::vector.