<?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[Probleme beim Operator überladen]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe ein Problem mit dem Überladen von Operatoren. Ich habe eine Klasse Vektor und ich würde gerne mit denen rechnen. Aufgaben wie Vektor x + Vektor y und Vektor x*double a funktionieren schon aber bei Aufgaben wie Vektor x * double a + Vektor x versagt mein Code.<br />
Was mache ich falsch? Vielen Dank im Voraus!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Vektor
{
private:
	/* Komponenten eines Vektors */
	double mx;
	double my;
	double mz;
public:
	/* Konstruktoren und Destruktoren */
	Vektor();
	Vektor(double, double, double);
	virtual ~Vektor();
	/* Referenzen */
	double &amp;x;
	double &amp;y;
	double &amp;z;
	/* Überladungen */
	friend ostream&amp; operator&lt;&lt;( ostream&amp; os, const Vektor&amp; objekt);
	friend Vektor operator+(Vektor &amp;vek1, Vektor &amp;vek2);
	friend Vektor operator*(Vektor &amp;vek1, Vektor &amp;vek2);	// * &lt;- Vektorprodukt
	friend Vektor operator*(Vektor &amp;vek1, double a);		// * &lt;- Skalare Multiplikation
};

Vektor::Vektor(void): mx(), my(), mz(), x(mx), y(my), z(mz) {}
Vektor::Vektor(double t_x, double t_y, double t_z): x(mx), y(my), z(mz) { 
	mx=t_x; my=t_y; mz=t_z;}
Vektor::~Vektor(void){}

ostream&amp; operator&lt;&lt;( ostream&amp; os, const Vektor&amp; objekt) {
	os &lt;&lt; &quot;Vektor: (&quot; &lt;&lt; objekt.x &lt;&lt; &quot;,&quot; &lt;&lt; objekt.y &lt;&lt; &quot;,&quot; &lt;&lt; objekt.z &lt;&lt; &quot;) \n&quot;;
	return os;
} 

Vektor operator+(Vektor &amp;vek1, Vektor &amp;vek2) {
	Vektor temp;
	temp.mx=vek1.mx+vek2.mx;
	temp.my=vek1.my+vek2.my;
	temp.mz=vek1.mz+vek2.mz;
	return temp;
}

Vektor operator*(Vektor &amp;vek1, Vektor &amp;vek2) {
	Vektor temp;
	temp.x = vek1.y*vek2.z - vek1.z*vek2.y;
	temp.y = vek1.z*vek2.x - vek1.x*vek2.z;
	temp.z = vek1.x*vek2.y - vek1.y*vek2.x;
	return temp;
}

Vektor operator*(Vektor &amp;vek1, double a) {
	Vektor temp;
	temp.x = vek1.x*a;
	temp.y = vek1.y*a;
	temp.z = vek1.z*a;
	return temp;
}

int main(void) {
	Vektor x(1,2,3);
	cout &lt;&lt; x;
	double a = 10;
	cout &lt;&lt; x*a;
	cout &lt;&lt; x*a + x;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/208438/probleme-beim-operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 19:38:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208438.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Mar 2008 13:41:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 13:41:54 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe ein Problem mit dem Überladen von Operatoren. Ich habe eine Klasse Vektor und ich würde gerne mit denen rechnen. Aufgaben wie Vektor x + Vektor y und Vektor x*double a funktionieren schon aber bei Aufgaben wie Vektor x * double a + Vektor x versagt mein Code.<br />
Was mache ich falsch? Vielen Dank im Voraus!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Vektor
{
private:
	/* Komponenten eines Vektors */
	double mx;
	double my;
	double mz;
public:
	/* Konstruktoren und Destruktoren */
	Vektor();
	Vektor(double, double, double);
	virtual ~Vektor();
	/* Referenzen */
	double &amp;x;
	double &amp;y;
	double &amp;z;
	/* Überladungen */
	friend ostream&amp; operator&lt;&lt;( ostream&amp; os, const Vektor&amp; objekt);
	friend Vektor operator+(Vektor &amp;vek1, Vektor &amp;vek2);
	friend Vektor operator*(Vektor &amp;vek1, Vektor &amp;vek2);	// * &lt;- Vektorprodukt
	friend Vektor operator*(Vektor &amp;vek1, double a);		// * &lt;- Skalare Multiplikation
};

Vektor::Vektor(void): mx(), my(), mz(), x(mx), y(my), z(mz) {}
Vektor::Vektor(double t_x, double t_y, double t_z): x(mx), y(my), z(mz) { 
	mx=t_x; my=t_y; mz=t_z;}
Vektor::~Vektor(void){}

ostream&amp; operator&lt;&lt;( ostream&amp; os, const Vektor&amp; objekt) {
	os &lt;&lt; &quot;Vektor: (&quot; &lt;&lt; objekt.x &lt;&lt; &quot;,&quot; &lt;&lt; objekt.y &lt;&lt; &quot;,&quot; &lt;&lt; objekt.z &lt;&lt; &quot;) \n&quot;;
	return os;
} 

Vektor operator+(Vektor &amp;vek1, Vektor &amp;vek2) {
	Vektor temp;
	temp.mx=vek1.mx+vek2.mx;
	temp.my=vek1.my+vek2.my;
	temp.mz=vek1.mz+vek2.mz;
	return temp;
}

Vektor operator*(Vektor &amp;vek1, Vektor &amp;vek2) {
	Vektor temp;
	temp.x = vek1.y*vek2.z - vek1.z*vek2.y;
	temp.y = vek1.z*vek2.x - vek1.x*vek2.z;
	temp.z = vek1.x*vek2.y - vek1.y*vek2.x;
	return temp;
}

Vektor operator*(Vektor &amp;vek1, double a) {
	Vektor temp;
	temp.x = vek1.x*a;
	temp.y = vek1.y*a;
	temp.z = vek1.z*a;
	return temp;
}

int main(void) {
	Vektor x(1,2,3);
	cout &lt;&lt; x;
	double a = 10;
	cout &lt;&lt; x*a;
	cout &lt;&lt; x*a + x;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1476587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476587</guid><dc:creator><![CDATA[solarwind]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 14:01:40 GMT]]></title><description><![CDATA[<p>*BULLSHIT*</p>
<p>Ansonsten. Was geht den nicht richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476601</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Mar 2008 14:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 13:52:36 GMT]]></title><description><![CDATA[<p>Ich vermisse Copy-ctor und den Zuweisungsoperator. Ersterer wird vom Compiler nicht in gewünschter Weise erzeugt werden, letzterer kann nicht implizit definiert werden. Nichtstatische Referenzen und Datenkonstanten sind im Allgemeinen recht unhandlich, meinem Eindruck nach sind sie sogar praktisch immer logisch falsch oder jedenfalls wie hier - überflüssig. Für so etwas gibt es Memberfunktionen, hier Referenzen einzusetzen, macht das Kopieren umständlich, verschwendet Speicher und ist vor allem nicht const-korrekt. Letzteres ist im Übrigen auch dein Problem: da rvalues nicht an nicht-const-Referenzen gebunden werden können, kann das Ergebnis der Multiplikation nicht Argument deines Additionsoperators sein. Der enstrpechende Parameter muss entweder eine Referenz auf const oder ein Objekt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476604</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 13:53:32 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Es ist schon mal schlecht ganze Vektoren zurückzugeben. Am besten du gibst einfach Referenzen zurück:</p>
<pre><code class="language-cpp">friend Vektor&amp; operator*(Vektor &amp;vek1, Vektor &amp;vek2);
</code></pre>
</blockquote>
<p>Grober Unfug. Das vergessen wir am Besten gleich wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476605</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 13:55:49 GMT]]></title><description><![CDATA[<p>Das Problem dürfte sein, dass ein Ausdruck Vektor * double einen temporären Vektor zurückgibt. Irgendwas war da, dass man in best. Situationen temporäre Objekte nicht an nicht-konstante Referenzen binden kann. Damit fällt der Aufruf (Ergebnis von Vektor * double) + Vektor flach.</p>
<p>Mach die Parameter an die Operatoren mal konstant.</p>
<p>(EDIT: Für die Definition von &quot;irgendwas&quot; siehe campers erster Post :D)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Das ist bei der Rückgabe temporärer Objekte keine gute Idee <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1476607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476607</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 13:57:55 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ich vermisse Copy-ctor und den Zuweisungsoperator. Ersterer wird vom Compiler nicht in gewünschter Weise erzeugt werden, letzterer kann nicht implizit definiert werden. Nichtstatische Referenzen und Datenkonstanten sind im Allgemeinen recht unhandlich, meinem Eindruck nach sind sie sogar praktisch immer logisch falsch oder jedenfalls wie hier - überflüssig. Für so etwas gibt es Memberfunktionen, hier Referenzen einzusetzen, macht das Kopieren umständlich, verschwendet Speicher und ist vor allem nicht const-korrekt. Letzteres ist im Übrigen auch dein Problem: da rvalues nicht an nicht-const-Referenzen gebunden werden können, kann das Ergebnis der Multiplikation nicht Argument deines Additionsoperators sein. Der enstrpechende Parameter muss entweder eine Referenz auf const oder ein Objekt sein.</p>
</blockquote>
<p>Mist. Hatte falsch im Kopf. Das war ja die Übergabe, die ich gemeint habe. :S</p>
<p>Hast natürlich Recht. <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>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Das ist bei der Rückgabe temporärer Objekte keine gute Idee <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>
</blockquote>
<p>Jah.. Habs kapiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> - Habs in meinem Vektor ja auch richtig gemacht. Als ich das geschrieben hatte ich irgendwie Zweifel, dass das stimmt, habe dann aber gedacht, dass ich das auch so gemacht habe (was ich aber eben nicht gemacht habe..). Naja.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476612</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:57:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme beim Operator überladen on Tue, 18 Mar 2008 14:09:49 GMT]]></title><description><![CDATA[<p>Danke der Tip von LordJaxom hat geholfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476620</guid><dc:creator><![CDATA[solarwind]]></dc:creator><pubDate>Tue, 18 Mar 2008 14:09:49 GMT</pubDate></item></channel></rss>