Welche Schreibweise ist richtig?
-
template<typename T> class Vector2 { public: Vector2<T>& operator=(const Vector2<T>& c) { m_x = c.x(); m_y = c.y(); memcpy(m_data, c.data(), sizeof(T)*2); return *this; } // ODER: Vector2& operator=(const Vector2& c) { m_x = c.x(); m_y = c.y(); memcpy(m_data, c.data(), sizeof(T)*2); return *this; } T m_x; T m_y; T m_data[2];Welche der 2 Möglichkeiten ist richtig oder "besser"? Zugelassen werden vom Compiler beide...
Danke.
lg
-
Es geht beides. Vector2 kann innerhalb dieser Klassen-Template-Definition wie Vector2<T> benutzt werden.
Besser ist jedoch, die Funktion ganz wegzulassen, da der vom Compiler generierte operator= genau das richtige tut.
Edit: Was soll das mit m_data[2] und memcpy??!!
-
Sebastian Pizer schrieb:
Es geht beides. Vector2 kann innerhalb dieser Klassen-Template-Definition wie Vector2<T> benutzt werden.
Besser ist jedoch, die Funktion ganz wegzulassen, da der vom Compiler generierte operator= genau das richtige tut.
Schönen Dank

Edit: Was soll das mit m_data[2] und memcpy??!!
Naja es ist die schnellste MÖglichkeit das zu kopieren... schreibe ich m_data = c.m_data kopiere ich ja nur den zeiger...
lg
-
C++R00ki3 schrieb:
Naja es ist die schnellste MÖglichkeit das zu kopieren...
Vor allem die unsicherste.
memcpy()kopiert bitweise, das führt bei Klassen, die keine PODs sind, zu undefiniertem Verhalten.Hier ist der eigene Zuweisungsoperator wie gesagt nicht nötig. Aber für andere Fälle, verwende
std::copy()(nachzuschlagen auf www.cplusplus.com):std::copy(c.m_data, c.m_data + 2, m_data);
-
Nexus schrieb:
C++R00ki3 schrieb:
Naja es ist die schnellste MÖglichkeit das zu kopieren...
Vor allem die unsicherste.
memcpy()kopiert bitweise, das führt bei Klassen, die keine PODs sind, zu undefiniertem Verhalten.Hier ist der eigene Zuweisungsoperator wie gesagt nicht nötig. Aber für andere Fälle, verwende
std::copy()(nachzuschlagen auf www.cplusplus.com):std::copy(c.m_data, c.m_data + 2, m_data);Naja, aber es ist eine Vector-Klasse auf die man so gar keinen Zugriff hat, ausser man verwendet den privat-namespace.
Verwendet wird nur:
typedef Vector2<f32> Vector2f;
typedef Vector2<u32> Vector2i;
Und dann ist ja T m_data[2] ein ganz stinknormales c-array. Aber ich werde Deinen Ratschlag beherzigen und std::copy nehmen :). Danke für den Tipp.
lg
-
C++R00ki3 schrieb:
Naja, aber es ist eine Vector-Klasse auf die man so gar keinen Zugriff hat, ausser man verwendet den privat-namespace.
Okay, dann würde ich aber wenigstens einen nicht so allgemeingültigen Namen wie
Tnehmen. Oder gleich immerstd::copy()einsetzen, das geht genauso mit Integern und Floats. Dann hast du auch keine Probleme, wenn du später plötzlich doch einen anderen Typen verwenden willst.C++R00ki3 schrieb:
Aber ich werde Deinen Ratschlag beherzigen und std::copy nehmen :). Danke für den Tipp.
Das heisst, du wirst meinen Ratschlag nicht beherzigen.

Ich sprach mich ja wie Sebastian Pizer dafür aus, den compilergenerierten Zuweisungsoperator zu verwenden. Denke an die Regel der Grossen Drei: Sobald du eine der drei Funktionen Kopierkonstruktor, Zuweisungsoperator oder Destruktor selbst definierst, solltest du im Normalfall die anderen beiden auch implementieren. Hier besteht aber kein Anlass dazu, weil der Compiler genau das Richtige tut.
-
Nexus schrieb:
C++R00ki3 schrieb:
Naja, aber es ist eine Vector-Klasse auf die man so gar keinen Zugriff hat, ausser man verwendet den privat-namespace.
Okay, dann würde ich aber wenigstens einen nicht so allgemeingültigen Namen wie
Tnehmen. Oder gleich immerstd::copy()einsetzen, das geht genauso mit Integern und Floats. Dann hast du auch keine Probleme, wenn du später plötzlich doch einen anderen Typen verwenden willst.C++R00ki3 schrieb:
Aber ich werde Deinen Ratschlag beherzigen und std::copy nehmen :). Danke für den Tipp.
Das heisst, du wirst meinen Ratschlag nicht beherzigen.

Ich sprach mich ja wie Sebastian Pizer dafür aus, den compilergenerierten Zuweisungsoperator zu verwenden. Denke an die Regel der Grossen Drei: Sobald du eine der drei Funktionen Kopierkonstruktor, Zuweisungsoperator oder Destruktor selbst definierst, solltest du im Normalfall die anderen beiden auch implementieren. Hier besteht aber kein Anlass dazu, weil der Compiler genau das Richtige tut.
Sorry wenn ich nochmal dumm frage:
Aber wird das Array dann wirklich korrekt kopiert? Dachte immer dass man genau für sowas dann denn operator= braucht... wenn er das hier richtig macht, wann genau braucht man dann diesen operator (ausser man möchte eine Klasse nur partiell kopieren)? Jetzt bin ich verwirrt :D.
lg
-
Ja, das Array wird kopiert. Ein Array ist schliesslich eine Sammlung von mehreren Objekten, die hintereinander im Speicher liegen.
Anders wäre es bei einem Zeiger, dem man mit
newSpeicher zuweist. Der Zeiger hält dann nur die Adresse des Speicherbereichs, in dem die eigentlichen Elemente liegen. Ein Array hingegen hält die Elemente gleich selbst, ist also kein Verweis.
-
Die eigentliche Frage ist aber, wofür benötigst du dieses Array bei einem 2D-Vector (denn x und y hast du ja schon definiert und aus mehr Membern sollte ein Vector auch nicht bestehen)???