<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[+= Operator richtig überladen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich soll für die Uni eine Klasse für 3 dimensionale Vektoren mit entsprechenden Operatoren schreiben. Mein Frage ist ob das was ich geschrieben habe richtig ist und wenn nicht warum es so falsch ist. Vielleicht kann ja jemand der mehr Erfahrung damit hat mal drüber schauen und es mir erklären.</p>
<pre><code class="language-cpp">#ifndef VECTOR_H
#define VECTOR_H

#include &lt;math.h&gt;

class Vector3{

float x = 0.0f;
float y = 0.0f;
float z = 0.0f;

public:
	//Konstruktor
	Vector3();

	Vector(float x, float y, float z){
		x = x;
		y = y;
		z = z;
	}

	//Deskruktor
	~Vektor3();

	//Addition
	const void operator += (const Vector3 &amp;vec){
		x = x + vec.x;
		y = y + vec.y;
		z = z + vec.z;
	}

	const Vector3 operator + (const Vector3 &amp;vec){
	   Vector3 dummy = new Vector3();
	   dummy.x = x + vec.x;
	   dummy.y = y + vec.y;
	   dummy.z = z + vec.z;

	   return dummy;
	}

	//Subtraktion
	Vector3 operator -= (const Vector3 &amp;vec);
	Vector3 operator - (const Vector3 &amp;vec);

	//Multiplikation
	Vector3 operator *= (float num);
}
</code></pre>
<p>greetz<br />
floetentheo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198572/operator-richtig-überladen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 07:22:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198572.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Nov 2007 21:23:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 21:24:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich soll für die Uni eine Klasse für 3 dimensionale Vektoren mit entsprechenden Operatoren schreiben. Mein Frage ist ob das was ich geschrieben habe richtig ist und wenn nicht warum es so falsch ist. Vielleicht kann ja jemand der mehr Erfahrung damit hat mal drüber schauen und es mir erklären.</p>
<pre><code class="language-cpp">#ifndef VECTOR_H
#define VECTOR_H

#include &lt;math.h&gt;

class Vector3{

float x = 0.0f;
float y = 0.0f;
float z = 0.0f;

public:
	//Konstruktor
	Vector3();

	Vector(float x, float y, float z){
		x = x;
		y = y;
		z = z;
	}

	//Deskruktor
	~Vektor3();

	//Addition
	const void operator += (const Vector3 &amp;vec){
		x = x + vec.x;
		y = y + vec.y;
		z = z + vec.z;
	}

	const Vector3 operator + (const Vector3 &amp;vec){
	   Vector3 dummy = new Vector3();
	   dummy.x = x + vec.x;
	   dummy.y = y + vec.y;
	   dummy.z = z + vec.z;

	   return dummy;
	}

	//Subtraktion
	Vector3 operator -= (const Vector3 &amp;vec);
	Vector3 operator - (const Vector3 &amp;vec);

	//Multiplikation
	Vector3 operator *= (float num);
}
</code></pre>
<p>greetz<br />
floetentheo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408494</guid><dc:creator><![CDATA[floetentheo]]></dc:creator><pubDate>Thu, 22 Nov 2007 21:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 21:28:08 GMT]]></title><description><![CDATA[<p><a href="http://www.parashift.com/c++-faq-lite/operator-overloading.html" rel="nofollow">http://www.parashift.com/c++-faq-lite/operator-overloading.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408498</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 22 Nov 2007 21:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 21:29:52 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const Vector3 operator + (const Vector3 &amp;vec){
       Vector3 dummy = new Vector3();
       dummy.x = x + vec.x;
       dummy.y = y + vec.y;
       dummy.z = z + vec.z;

       return dummy;
    }
</code></pre>
<p>da stimmt nix, aber garnix ^^ new braucht ein delete, new ist Heap, der Rest deines Codes sieht aber nach Stack aus... usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408500</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 22 Nov 2007 21:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 22:14:23 GMT]]></title><description><![CDATA[<p>Da ich leider noch nicht in C++ denken kann sagt mir das überhaupt nix.<br />
Ist der += Operator richtig so wie ich ihn geschrieben habe?<br />
Und was ist denn genau falsch an dem + Operator?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408518</guid><dc:creator><![CDATA[floetentheo]]></dc:creator><pubDate>Thu, 22 Nov 2007 22:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 22:59:33 GMT]]></title><description><![CDATA[<p>stimmt, ich denke, du solltest dir erst mal Grundlagen über Stack und Heap ansehen. Das hat was mit Speicherbereichen zu tun.</p>
<p>Da gibts später sogar noch interessante dinge.</p>
<p>z.B Weil Stack und Heap sich entgegenwachsen gibt's Overflows usw... und gerade in der Programmierung ist Stack&amp;Heap wichtig. Schon wenn du Variablen global deklarierst anstatt in der int main...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408538</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Thu, 22 Nov 2007 22:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Thu, 22 Nov 2007 23:45:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Addition
	const Vector3&amp; operator += (const Vector3 &amp;vec){
		x = x + vec.x;
		y = y + vec.y;
		z = z + vec.z;
                return *this;
	}
</code></pre>
<p>So wird das gemacht. erspart dir vieles und vec3 = vec3 + vec3; is damit auch möglich. Wobei operator+ mit void nicht erlaubt ist, nach ansi. Wenn du den Code mit g++ und der Einstellung --ansi kompilierst, bekommst du Fehler.</p>
<pre><code class="language-cpp">const Vector3 operator + (const Vector3 &amp;vec){
	   Vector3 dummy = new Vector3();
	   dummy.x = x + vec.x;
	   dummy.y = y + vec.y;
	   dummy.z = z + vec.z;

	   return dummy;
	}
}
</code></pre>
<p>Was du hier machst ist völlig falsch. new initialisiert einen Speicherbereich für Vector3 auf einen Zeiger. Wenn du eine Instanz der Klasse erstellen willst, reicht</p>
<pre><code class="language-cpp">Vector3 dummy;
// Richtig wäre btw 
Vector3* dummy = new Vector3;
</code></pre>
<p>Richtig wird so überladen:</p>
<pre><code class="language-cpp">Vector3&amp; operator += (const Vector3&amp; vec)
   {
      z += vec.z;
      x += vec.x;
      y += vec.y;
      return *this;
   }
</code></pre>
<pre><code class="language-cpp">float x = 0.0f;
float y = 0.0f;
float z = 0.0f;
</code></pre>
<p>Ist auch falsch. Initialisert wird im Constructor.</p>
<pre><code class="language-cpp">Vector3::Vector3()
{
   x = 0; y = 0; z = 0;
}
</code></pre>
<p>Zur Veranschaulichung einer meiner Vektoren. Lass dich vom Template nicht iritieren, ersetze das T in Gedanken einfach mit float oder int. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">/*********************************************************
 * File   : dtVector3.h 
 * Author : D. Gentner                
 * Date   : 2006/10/20                    
 * Purpose: A 3D-Vector for math-operations.
 * Todo   :      
 *
 * License: Public Domain
 *********************************************************/
#ifndef _DTVECTOR3_H_
#define _DTVECTOR3_H_

/** \brief This is a simple Template for a 3 Dimensional Vector.
  */
template &lt;typename T&gt;
class dtVector3
{ 
public:
    inline dtVector3(){ m_x = m_y = m_z = 0; }
    inline ~dtVector3(){}

    /** \brief Set-Constructor */
    inline dtVector3(T _x, T _y, T _z) { m_x=_x; m_y=_y; m_z=_z; }
    /** \brief Copy-Constructor */
    inline dtVector3(const dtVector3&amp; v) { m_y = v.getX(); m_y = v.getY(); m_z = v.getZ(); }    

    /** \brief Setter */
    void setX(const T _x){ m_x = _x; }
    /** \brief Setter */
    void setY(const T _y){ m_y = _y; }
    /** \brief Setter */
    void setZ(const T _z){ m_z = _z; }
    /** \brief Setter */
    void set(const dtVector3&lt;T&gt;&amp; t){ m_x = t.getX(); m_y = t.getY(); m_z = t.getZ(); }
    void set(const T x, const T y, const T z){ m_x = x; m_y=y;m_z=z;};

    /** \brief Getter */
    T getX()const { return m_x; }
    /** \brief Getter */
    T getY()const { return m_y; }
    /** \brief Getter */
    T getZ()const { return m_z; }
    /** \brief Getter */
    dtVector3&lt;T&gt; get()const { return *this; }

    /** \brief Overloaded = operator */
    inline dtVector3&lt;T&gt; operator= ( const dtVector3&lt;T&gt;&amp; v)
    {
        m_x = v.getX(); m_y = v.getY(); m_z = v.getZ();
        return *this;
    }

    /** \brief Overloaded = operator */
    inline dtVector3&lt;T&gt; operator= ( const T&amp; v)
    {
        m_x = m_y = m_z = v;
        return *this;
    }

    /** \brief Overloaded ++ postfix operator */
    inline const dtVector3&lt;T&gt; operator++(int)
    {
        dtVector3&lt;T&gt; tmp= *this;
        m_x++; m_y++; m_z++;
        return tmp;
    }

    /** \brief Overloaded ++ prefix operator */
    inline dtVector3&lt;T&gt; operator++()
    {
        m_x++; m_z++; m_y++;
        return *this;
    }

    /** \brief overloaded + operator */
    inline dtVector3&lt;T&gt; operator+(const T v)
    {
        return dtVector3&lt;T&gt;(m_x+v, m_y+v, m_z+v);
    }

    /** \brief overloaded + operator */
    inline dtVector3&lt;T&gt; operator+(const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x+v.getX(), m_y+v.getY(), m_z+v.getZ());
    }

    /** \brief overloaded += operator */
    inline dtVector3&lt;T&gt; operator+= (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x+=v.getX(), m_y+=v.getY(), m_z+=v.getZ());
    }

    /** \brief overloaded += operator */
    inline dtVector3&lt;T&gt; operator+= (const T v)
    {
        return dtVector3&lt;T&gt;(m_x+=v, m_y+=v, m_z+=v);
    }

    /** \brief Overloaded -- postfix operator */
    inline const dtVector3&lt;T&gt; operator--(int)
    {
        dtVector3&lt;T&gt; tmp= *this;
        m_x--; m_y--; m_z--;
        return tmp;
    }

    /** \brief Overloaded -- prefix operator */
    inline dtVector3&lt;T&gt; operator--()
    {
        m_x--; m_z--; m_y--;
        return *this;
    }

    /** \brief overloaded - operator */
    inline dtVector3&lt;T&gt; operator- ( const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x-v.getX(),m_y-v.getY(),m_z-v.getZ());
    }

    /** \brief overloaded - operator */
    inline dtVector3&lt;T&gt; operator- ( const T v)
    {
        return dtVector3&lt;T&gt;(m_x-v, m_y-v, m_z-v);
    }

    /** \brief overloaded -= operator */
    inline dtVector3&lt;T&gt; operator-= (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x-=v.getX(),m_y-=v.getY(),m_z-=v.getZ());
    }

    /** \brief overloaded -= operator */
    inline dtVector3&lt;T&gt; operator-= (const T v)
    {
        return dtVector3&lt;T&gt;(m_x-=v,m_y-=v,m_z-=v);
    }

    /** \brief overloaded * operator */
    inline dtVector3&lt;T&gt; operator* (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x*v.getX(), m_y*v.getY(), m_z*v.getZ());
    }

    /** \brief overloaded * operator */
    inline dtVector3&lt;T&gt; operator* (const T v)
    {
        return dtVector3&lt;T&gt;(m_x*v, m_y*v, m_z*v);
    }

    /** \brief overloaded *= operator */
    inline dtVector3&lt;T&gt; operator*= (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x*=v.getX(), m_y*=v.getY(), m_z*=v.getZ());
    }

    /** \brief overloaded *= operator */
    inline dtVector3&lt;T&gt; operator*= (const T v)
    {
        return dtVector3&lt;T&gt;(m_x*=v, m_y*=v, m_z*=v);
    }

    /** \brief overloaded / operator */
    inline dtVector3&lt;T&gt; operator/ (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x/v.getX(),m_y/v.getY(),m_z/v.getZ());
    }

    /** \brief overloaded / operator */
    inline dtVector3&lt;T&gt; operator/ (const T v)
    {
        return dtVector3&lt;T&gt;(m_x/v,m_y/v,m_z/v);
    }

    /** \brief overloaded /= operator */
    inline dtVector3&lt;T&gt; operator/= (const dtVector3&lt;T&gt;&amp; v)
    {
        return dtVector3&lt;T&gt;(m_x/=v.getX(),m_y/=v.getY(),m_z/=v.getZ());
    }

    /** \brief overloaded / operator */
    inline dtVector3&lt;T&gt; operator/= (const T v)
    {
        return dtVector3&lt;T&gt;(m_x/=v,m_y/=v,m_z/=v);
    }

    /** \brief overloaded == operator */
    inline bool operator== (const dtVector3&amp; v)
    {
        return ( m_x == v.getX() &amp;&amp; m_y == v.getY() &amp;&amp; m_z == v.getZ() );
    }

    /** \brief overloaded &lt; operator */
    inline bool operator&lt; ( const dtVector3&lt;T&gt;&amp; v)
    {
        return ( m_x &lt; v.getX() &amp;&amp; m_y &lt; v.getY() &amp;&amp; m_z &lt; v.getZ() );
    }

    /** \brief overloaded &gt; operator */
    inline bool operator&gt; ( const dtVector3&lt;T&gt;&amp; v)
    {
        return ( m_x &gt; v.getX() &amp;&amp; m_y &gt; v.getY() &amp;&amp; m_z &gt; v.getZ() );
    }

    /** \brief overloaded [] operator
      *
      *
      * Please make sure that you only use values from 0-2, where 
      * 0 = x, 1 = y, 2 = z.
      *
      */
    inline T operator[] ( const int index )
    {
        if (index == 0){        
            return m_x;
        }
        else if (index == 1){
            return m_y;
        }
        else if (index == 2){
            return m_z;
        }
        else{
#ifdef _DEBUG
            throw std::runtime_error(&quot;dtVector3::operator[]: Index Out of Range!&quot;);
#endif 
            return 0;
        }
    }

private:
    T m_x, m_y, m_z;
};

#endif /* _DTVECTOR3_H_ */
</code></pre>
<p>HTH<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408545</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 22 Nov 2007 23:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Fri, 23 Nov 2007 06:58:27 GMT]]></title><description><![CDATA[<p>Noch eine Ergänzung zur Beziehung zwischen += und +: Du verwendest zweimal (fast) identischen Code, das erzeugt Redundanzen und bringt die Gefahr, daß du irgendwann nur eine der Funktionen anpasst und die andere vergisst - das würde dazu führen, daß &quot;v+=u;&quot; plötzlich nicht mehr äquivalent zu &quot;v=v+u;&quot; ist. Besser ist es da, den operator+ durch operator+= auszudrücken:</p>
<pre><code class="language-cpp">//btw, hier geht auch ein globaler Operator
const Vector3D operator+(Vector3D l/*bewußt kein const-ref*/,const Vector3D&amp; r)
{
  l+=r;
  return l;
}
</code></pre>
<p>@scorcher: Dem Ansi-Standard ist es egal, was die überladenen Operatoren zurückgeben - void-Rückgabe ist &quot;nur&quot; inkonsistent gegenüber dem Verhalten der Build-in Typen.</p>
<p>Und wo wir gerade bei Redundanzen sind - deine Vector-Klasse hat ähnlich redundante Operatoren wie dort oben (z.B. + vs. += oder ++x vs. x++).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408580</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 23 Nov 2007 06:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Fri, 23 Nov 2007 12:09:17 GMT]]></title><description><![CDATA[<p>Viel Dank an Scorcher24, hat wohl doch jemand meine Frage genau gelesen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Eine Frage hätte ich jedoch noch. Ist der Ausdruck</p>
<pre><code class="language-cpp">Vector3&amp; vec;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Vector3 &amp;vec;
</code></pre>
<p>vom prinzip her das gleiche?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408771</guid><dc:creator><![CDATA[floetentheo]]></dc:creator><pubDate>Fri, 23 Nov 2007 12:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Fri, 23 Nov 2007 12:12:26 GMT]]></title><description><![CDATA[<p>Es ist das selbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408775</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 23 Nov 2007 12:12:26 GMT</pubDate></item><item><title><![CDATA[Reply to += Operator richtig überladen on Fri, 23 Nov 2007 13:22:50 GMT]]></title><description><![CDATA[<p>ach schon gut.. sorry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408821</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 23 Nov 2007 13:22:50 GMT</pubDate></item></channel></rss>