<?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[Überaldung von &amp;quot;=&amp;quot;]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich wollte heute mal das = überladen, musste aber dann in meinem Buch lesen, dass das Überladen von = nur in Klassen definiert werden darf. Weiter schreibt mein Buch dazu nichts. Ich verstehe allerdings nicht so ganz was mit &quot;darf nur in Klassen definiert werden&quot; gemeint ist. Ich hab hier mal Code produziert der aber nicht so ganz tut was ich will:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&quot;test.h&quot;

int main()
{
	INT a, b, c;

	a = 5;

return 0;
}
</code></pre>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class INT
{
private:
	double val;

public:
	INT() : val(0)
	{

	}

	INT(double v) : val(v)
	{

	}

	INT&amp; operator = (INT &amp;v)
	{
		val = v.val;

		return *this;
	}

	INT&amp; operator + (INT &amp;v)
	{
		val = val * v.val;

		return *this;
	}

};

#endif TEST_H
</code></pre>
<p>Ich weiß das überladen von + zu * ist sinnlos; es soll ja auch nur eine Übungsaufgabe sein! Primär geht es mir darum zu verstehen, wie ich = im Sinne einer Linkszweisung überladen kann!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305587/überaldung-von-quot-quot</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 19:59:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305587.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Jul 2012 16:46:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 16:46:00 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich wollte heute mal das = überladen, musste aber dann in meinem Buch lesen, dass das Überladen von = nur in Klassen definiert werden darf. Weiter schreibt mein Buch dazu nichts. Ich verstehe allerdings nicht so ganz was mit &quot;darf nur in Klassen definiert werden&quot; gemeint ist. Ich hab hier mal Code produziert der aber nicht so ganz tut was ich will:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&quot;test.h&quot;

int main()
{
	INT a, b, c;

	a = 5;

return 0;
}
</code></pre>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class INT
{
private:
	double val;

public:
	INT() : val(0)
	{

	}

	INT(double v) : val(v)
	{

	}

	INT&amp; operator = (INT &amp;v)
	{
		val = v.val;

		return *this;
	}

	INT&amp; operator + (INT &amp;v)
	{
		val = val * v.val;

		return *this;
	}

};

#endif TEST_H
</code></pre>
<p>Ich weiß das überladen von + zu * ist sinnlos; es soll ja auch nur eine Übungsaufgabe sein! Primär geht es mir darum zu verstehen, wie ich = im Sinne einer Linkszweisung überladen kann!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229326</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 16:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 17:25:16 GMT]]></title><description><![CDATA[<p>An sich schon fast richtig, bloß const-correctness nicht beachtet:</p>
<pre><code class="language-cpp">INT&amp; operator = (const INT &amp;v)
    {
        val = v.val;

        return *this;
    }
</code></pre>
<p>P.S.: Dein Additionsoperator sollte besser einen INT, keinen INT&amp; zurückgeben, das vermeidet ein paar komische Effekte.<br />
Deine beiden Konstruktoren könntest du durch einen Defaultwert zu einem zusammenfassen. Ist double als Konstruktorargumentstyp nicht ein bisschen komisch für einen Integerersatz?<br />
Derzeit macht dein Zuweisungsoperator übrigens das gleiche wie der Defaultzuweisungsoperator (es wird bei Bedarf nämlich automatisch einer erstellt, wenn man keinen angibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229343</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Jul 2012 17:25:16 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 17:27:36 GMT]]></title><description><![CDATA[<p>Das ganze nennt man Zuweisungsoperator. Du kannst es nur für Klassen verwenden, da dies fast die selbe Funktionsweiße ist wie du sie im Kopierkonstruktor findest. Du kannst damit das Kopierverhalten deiner Kasse selbst in die Hand nehmen. Wenn du den Operator nicht selbst explizit implementierst, wird dir dein Compiler einen standartmäßigen Zuweisungsoperator erstellen. Dieser kopiert dann alle Datenelemente deiner Klasse.</p>
<pre><code class="language-cpp">INT&amp; operator = ( const INT&amp; rhs )
    {
        this-&gt;x = rhs.x;

        return *this;
    }
</code></pre>
<p>MfG</p>
<p>Edit: SeppJ war mal wieder zu schnell... <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/2229345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229345</guid><dc:creator><![CDATA[yihaaa]]></dc:creator><pubDate>Mon, 02 Jul 2012 17:27:36 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 17:27:32 GMT]]></title><description><![CDATA[<p>Damit meint dein Buch wahrscheinlich, dass oprator= nur eine Elementfunktion sein kann, keine freie Funktion.</p>
<p>Einen solchen Operator musst du aber in diesem Fall auch nicht selbst deklarieren oder definieren. operator= gehört zu den sogenannten &quot;special member functions&quot;, die ggf automatisch generiert werden.</p>
<p>Ein Tipp noch bei binären Operatoren wie +, -, <em>, /: Vermeide die Veränderung von Operanden; denn das würde keiner erwarten, dass bei c=a+b plötzlich a verändert wird. operator+ liefert auch normalerweise keine Referenz, sondern ein neues Objekt. Du hast hier operator+ so definiert, wie man eigentlich operator</em>= implementiert. Außerdem solltest du solche Operatoren lieber als freie Funktionen implementieren. Das hätte hier dann den Vorteil, dass 23+Int(42) auch funktionierte, statt nur Int(42)+23.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229347</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 02 Jul 2012 17:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 17:48:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Warum muss man hier const verwenden und was bewirkt const hier?</p>
<p>Schon mal Danke für die vielen hilfreichen Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229359</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 17:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 17:56:07 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Warum muss man hier const verwenden und was bewirkt const hier?</p>
</blockquote>
<p>Weil du sonst der Funktion keine temporären (oder allgemein konstante) Werte per Referenz übergeben kannst. Hier hast du einen solchen Wert vorliegen, denn bei</p>
<pre><code class="language-cpp">a = 5;
</code></pre>
<p>steht links ein INT, rechts ein int. Einen <code>operator=(INT, int)</code> hast du aber nirgends definiert. Aber es gibt ja noch den Konstruktor <code>INT(double v)</code> , so dass der int über die Konvertierung nach double in einen INT konvertiert werden kann. Das dabei entstehende Objekt ist aber ein temporay vom Typ INT und kann nicht verändert werden. Die ursprüngliche Funktionssignatur <code>INT&amp; operator = (INT &amp;v)</code> sagt aber gerade aus, dass auch das v sich verändert (bzw. verändern kann), das passt daher nicht zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229366</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Jul 2012 17:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:12:45 GMT]]></title><description><![CDATA[<p>Danke SeppJ für die ausführliche Antwort!</p>
<p>Ich hab jetzt mal versucht für einen eigenen Datentypen Vektor den output-Stream zu überladen. Leider funktioniert das noch nicht so ganz. Der Compiler spuckt mir einige Fehler aus. Hier der Code:</p>
<p>Deklaration in der Klasse:</p>
<pre><code class="language-cpp">friend ostream &amp;operator &lt;&lt; (ostream &amp;output, const Vector &amp;v);
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">ostream&amp; Vector::operator &lt;&lt; (ostream &amp;output, const Vector &amp;v)
{
	output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

	return output;
}
</code></pre>
<p>Fehlermeldungen:</p>
<pre><code>Fehler	1	error C2143: Syntaxfehler: Es fehlt ';' vor '&amp;'	

Fehler	2	error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig	

Fehler	3	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.	

Fehler	4	error C2061: Syntaxfehler: Bezeichner 'ostream'	

Fehler	5	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.	

Fehler	6	error C2805: Binärer Operator '&lt;&lt;' hat zu wenig Parameter	

Fehler	7	error C2143: Syntaxfehler: Es fehlt ';' vor '&amp;'	

Fehler	8	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.	

Fehler	9	error C2086: 'int ostream': Neudefinition	

Fehler	10	error C2065: 'output': nichtdeklarierter Bezeichner	

Fehler	11	error C2059: Syntaxfehler: 'const'	

Fehler	12	error C2143: Syntaxfehler: Es fehlt ';' vor '{'	

Fehler	13	error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?	

Fehler	14	error C2143: Syntaxfehler: Es fehlt ';' vor '&amp;'	

Fehler	15	error C2433: 'ostream': 'friend' bei der Deklaration von Daten nicht zulässig	

Fehler	16	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.	

Fehler	17	error C2061: Syntaxfehler: Bezeichner 'ostream'	

Fehler	18	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.	

Fehler	19	error C2805: Binärer Operator '&lt;&lt;' hat zu wenig Parameter
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2229373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229373</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:19:31 GMT]]></title><description><![CDATA[<p>Bitte mal dritten Link in meiner Signatur lesen. Spekulation wäre alles von vergessenem Semikolon zu vergessener Auflösung des Namespaces std. Das bringt nichts, wild herum zu raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229378</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:20:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">friend ostream &amp;operator &lt;&lt; (ostream &amp;output, const Vector &amp;v); 	

ostream&amp; operator &lt;&lt; (ostream &amp;output, const Vector &amp;v)
{
return output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Das ist keine Memberfunktion der Klasse. So dachte dein Compiler an den shift operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229379</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:25:46 GMT]]></title><description><![CDATA[<p>Also:</p>
<p>Benutzte IDE: Visual Studio 2010<br />
Benutzter Compiler: Der, der in VS2010 eingebaut ist.</p>
<p>Ich hab in verteilten Dateien gearbeitet. Ich kopiere jetzt alles für mich relevant erschienene hier rein:</p>
<p>Header-Datei:</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class Vector
{
private:
	double x;
	double y;
	double skalar;

public:
	Vector();
	Vector(double _x, double _y);

	Vector &amp;operator + (const Vector vec);
	Vector &amp;operator - (const Vector vec);
	double &amp;operator * (const Vector vec);
	friend ostream &amp;operator &lt;&lt; (ostream &amp;output, const Vector &amp;v);
};

#endif TEST_H
</code></pre>
<p>Implementierungsdatei:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&quot;test.h&quot;
//using namespace std;

Vector::Vector() : x(0), y(0)
{

}

Vector::Vector(double _x, double _y) : x(_x), y(_y)
{

}

Vector&amp; Vector::operator + (const Vector vec)
{
	x = x + vec.x;
	y = y + vec.y;

	return *this;
}

Vector&amp; Vector::operator - (const Vector vec)
{
	x = x - vec.x;
	y = y - vec.y;

	return *this;
}

double&amp; Vector::operator * (const Vector vec)
{
	x = x * vec.y;
	y = y * vec.y;
	skalar = x + y;

	return skalar;
}

ostream&amp; Vector::operator &lt;&lt; (ostream &amp;output, const Vector &amp;v)
{
	output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

	return output;
}
</code></pre>
<p>Die main-Datei hat keine Auswirkung auf die Fehler! Egal ob ich Vektoren deklariere oder nicht, ob ich sie schon ausgeben lasse, oder nicht. Alles egal. Deshalb lass ich die main mal weg. Ich hoff, jetzt entspricht es dem Standard hier im Board.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229383</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:30:40 GMT]]></title><description><![CDATA[<p><code>std::ostream</code></p>
<p>Dazu brauchst du noch entweder den Header <code>iosfwd</code> , <code>ostream</code> oder gleich <code>iostream</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229389</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:37:08 GMT]]></title><description><![CDATA[<p>Den header &lt;iostream&gt; hab ich aber in der Implementierungsdate schon eingebunden, oder meinst du mit deiner letzten Antwort, dass ich den in der Klassendatei auch noch einbinden soll?</p>
<p>klasse:</p>
<pre><code class="language-cpp">friend std::ostream &amp;operator &lt;&lt; (std::ostream &amp;output, const Vector &amp;v);
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">std::ostream&amp; Vector::operator &lt;&lt; (std::ostream &amp;output, const Vector &amp;v)
{
	output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

	return output;
}
</code></pre>
<p>So siehts nach den veränderungenaus. alles andere ist so geblieben. Fehlermeldung:Fehler 1 error C2039: '&lt;&lt;': Ist kein Element von 'Vector'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229394</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:46:10 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Header-Datei:</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class Vector
{
private:
	double x;
	double y;
	double skalar;
public:
	Vector();
	Vector(double _x, double _y);

	Vector &amp;operator + (const Vector vec);
	Vector &amp;operator - (const Vector vec);
	double &amp;operator * (const Vector vec);
	friend ostream &amp;operator &lt;&lt; (ostream &amp;output, const Vector &amp;v);
};
</code></pre>
</blockquote>
<p><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="🙄"
    /><br />
Du hast wieder ? mit ?= verwelchselt, diesmal im Falle +, - und * anstelle des Fragezeichens.</p>
<pre><code class="language-cpp">int a = 23;
int b = 42;
a+b; //verändert a nicht!!!
</code></pre>
<p>Im Wesentlichen hast du den letzten Absatz meines vorherigen Beitrags komplett ignoriert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229404</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:50:12 GMT]]></title><description><![CDATA[<p>Ich wollte mit dieser *neuen* Klasse die Überladung der Operatoren nicht implementieren. Ich hab deinen letzten Absatz deiner Antwort sehr wohl gelesen und deine Tips im Projekt berücksichtigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229408</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:52:42 GMT]]></title><description><![CDATA[<p>Bei der Implementation von <code>ostream&amp; operator &lt;&lt;()</code> mußt Du <code>Vector::</code> weglassen, da sie kein Member von <code>Vector</code> ist. (Hat Nymer schon mal erwähnt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229411</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 18:58:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@Krümelkacker</a>: Hier mal nochmal die Variante die du mir vorgeschlagen hast. Ich hoffe, dass das dem entspricht, was du mir beibringen wolltest:</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class Vector
{
private:
	double x;
	double y;
	double skalar;

public:
	Vector();
	Vector(double _x, double _y);

	Vector &amp;operator += (const Vector vec);
	Vector &amp;operator + (const Vector vec);

	Vector &amp;operator -= (const Vector vec);
	Vector &amp;operator - (const Vector vec);

	double &amp;operator * (const Vector vec);
	friend std::ostream &amp;operator &lt;&lt; (std::ostream &amp;output, const Vector &amp;v);
};

#endif TEST_H
</code></pre>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&quot;test.h&quot;

Vector::Vector() : x(0), y(0)
{

}

Vector::Vector(double _x, double _y) : x(_x), y(_y)
{

}

Vector&amp; Vector::operator += (const Vector vec)
{
	x = x + vec.x;
	y = y + vec.y;

	return *this;
}

Vector&amp; Vector::operator + (const Vector vec)
{
	Vector tmp(x, y);

	return tmp += vec;
}

Vector&amp; Vector::operator -= (const Vector vec)
{
	x = x - vec.x;
	y = y - vec.y;

	return *this;
}

Vector&amp; Vector::operator - (const Vector vec)
{
	Vector tmp(x, y);

	return tmp -= vec;
}

double&amp; Vector::operator * (const Vector vec)
{
	x = x * vec.y;
	y = y * vec.y;
	skalar = x + y;

	return skalar;
}

std::ostream&amp; operator &lt;&lt; (std::ostream &amp;output, const Vector &amp;v)
{
	output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

	return output;
}
</code></pre>
<p>Danke Nymer, dass du mich nochmal drauf aufmerksam gemacht hast! Jetzt funktioniert übrigens die gesamte Klasse! Danke an euch. Das hat mir sehr weiter geholfen! Über eine Rückmeldung von Krümelkacker würde ich mich sehr freun, ob das dem entspricht, was er mir beibringen wollte <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/2229419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229419</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 02 Jul 2012 18:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Mon, 02 Jul 2012 20:14:47 GMT]]></title><description><![CDATA[<p>Du kannst übrigens direkt:</p>
<pre><code class="language-cpp">return output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
</code></pre>
<p>schreiben anstatt:</p>
<pre><code class="language-cpp">output &lt;&lt; &quot;(&quot; &lt;&lt; v.x &lt;&lt; &quot;,&quot; &lt;&lt; v.y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;

    return output;
</code></pre>
<p>, was den gleichen Effekt hat.<br />
Ich persönlich finde das schöner <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/2229468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229468</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Mon, 02 Jul 2012 20:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 08:37:39 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@Krümelkacker</a>: Hier mal nochmal die Variante die du mir vorgeschlagen hast. Ich hoffe, dass das dem entspricht, was du mir beibringen wolltest:</p>
</blockquote>
<p>Du gibst bei operator+ und co <strong>Referenzen auf temporäre Objekte</strong> zurück, die dann <strong>ungültig</strong> werden. Bei operator+ und co fehlt noch ein <code>const</code> am Ende der Deklarationen. Die Parameter würde ich als Referenz-auf-konstant entgegen nehmen. <em><em>Operator</em> verändert das Objekt auf der linken Seite und gibt eine Referenz auf ein Datenelement der linken Seite zurück</em>*. Das ist eine <strong>extrem schlechte Idee</strong> für einen binären Operator, der normalerweise seine Operanden nicht verändert und nur einen neuen Wert zurück gibt.</p>
<p>Nur mal so ein Beispiel:</p>
<pre><code class="language-cpp">Vector&amp; Vector::operator + (const Vector vec)
{
	Vector tmp(x, y);
	return tmp += vec;
}
</code></pre>
<p>hätte lieber</p>
<pre><code class="language-cpp">Vector Vector::operator + (const Vector&amp; vec) const // &lt;- const nicht vergessen!
{ //  ^ keine Referenz!!               ^ Referenz!!
    Vector tmp(x, y);
    tmp += vec;
    return tmp; // &lt;-- so aufgeschrieben erlaubt es noch die NRVO-Optimierung
}
</code></pre>
<p>heißen sollen. Allerdings kannst du es auch so schreiben:</p>
<pre><code class="language-cpp">Vector Vector::operator + (const Vector&amp; vec) const
{
    return Vector(x+vec.x,y+vec.y);
}
</code></pre>
<p>wobei ich natürlich nicht weiß, was das mit deinem <code>skalar</code> -Member da soll. Der wird ja <strong>nicht mal irgendwo initialisiert</strong>!</p>
<p>Prinzipiell würde ich operator+, operator-, operator* aus &quot;Symmetriegründen&quot; auch als freie Funktionen definieren. Was das genau heißt, hatte ich letztens schon angedeutet.</p>
<p>Du musst übrigens nicht das Rad neu erfinden. Es gibt beispielsweise eine nette Matrix/Vektor-Bibliothek mit diversen netten Funktionen: Eigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229559</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 03 Jul 2012 08:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 08:46:21 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Prinzipiell würde ich operator+, operator-, operator* aus &quot;Symmetriegründen&quot; auch als freie Funktionen definieren. Was das genau heißt, hatte ich letztens schon angedeutet.</p>
</blockquote>
<p>Das würde ich unbedingt machen und so macht man es afaik auch.<br />
Wenn du z.B. noch multiplizieren mit einem Skalar hinzufügst, geht das so nicht (V*s) geht (s*V) nicht.</p>
<blockquote>
<p>Du musst übrigens nicht das Rad neu erfinden. Es gibt beispielsweise eine nette Matrix/Vektor-Bibliothek mit diversen netten Funktionen: Eigen.</p>
</blockquote>
<p>Eigen ist toll. Einfach inkludieren und fertig.<br />
Vielleicht will er aber auch einfach operatoren Überladung üben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229564</guid><dc:creator><![CDATA[Fl0]]></dc:creator><pubDate>Tue, 03 Jul 2012 08:46:21 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 16:55:58 GMT]]></title><description><![CDATA[<p>Danke Leute, für eure tollen Beispiele und Hilfe!</p>
<p>Ja, ich will in der Tat die Operatorüberladung üben. Ich werde mir so gut es geht mir eure Tips zu herzen nehmen! Ich hab hier nun übrigens wieder ein Problemchen mit einer Klasse und einer Überladung. Verwendete IDE und Compiler: VS2010.</p>
<p>Header:</p>
<pre><code class="language-cpp">class Bitvector
{
private:
	unsigned int bits;	//Anzahl der Bits im Bitvektor
	unsigned char byte;	//chars aus denen sich der Bitvektor zusammensetzt
	unsigned char* bv;	//pointer auf die aneinandergereihten chars

public:
	Bitvector();
	Bitvector(unsigned int bits);
	~Bitvector();

	friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp; output, Bitvector &amp;bv);
};
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">std::ostream&amp; operator &lt;&lt; (std::ostream &amp;output, const Bitvector &amp;bv)
{
	bv.bits; //hier gibts den Fehler!

return output;
}
</code></pre>
<p>Compilerfehler:</p>
<pre><code>Fehler	1	error C2248: &quot;Bitvector::bits&quot;: Kein Zugriff auf private Member, dessen Deklaration in der Bitvector-Klasse erfolgte.
</code></pre>
<p>Ich brauch in der Überladung Zugriff auf die &quot;bits&quot; der Klasse. Wie mach ich das dann hier? Ich hab eigentlich gedacht, dass ich hier ohne Probleme mein Wissen von gester anwenden kann, aber schon kommt wieder was das mich raushaut... Könnt ihr mir helfen?</p>
<p>Edit:<br />
Wenn ich den Zugriffsspezifizierer private auf public ändere, bekomme ich hier Zugriff auf bits. Warum kann ich bei dieser Ausgabeoperator-Überladung nicht, wie in &quot;normalen&quot; Methoden üblich, auf private-Variablen zugreifen? Wie gehe ich dann hier vor? Muss ich eine Methode schreiben, die mir den Wert private-Var. liefert? Oder gibt es eine andere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229719</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Tue, 03 Jul 2012 16:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 17:13:55 GMT]]></title><description><![CDATA[<p><code>friend</code> gewährt einer Methode Zugriff auf private Daten einer Klasse (solltest du wissen). Deine beiden Methoden haben nicht die gleiche Signatur, weshalb die Implementation nicht als die <code>friend</code> Methode erkannt wird. ( <code>const</code> zuwenig)</p>
<p>Übrigens wie mein Compiler richtig meckert, musst du so unbedingt den Copy-Konstruktor und den operator= überladen. Am besten gar keine Pointer verwernden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229725</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Tue, 03 Jul 2012 17:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 17:20:28 GMT]]></title><description><![CDATA[<p>Wenn ich deine Antwort richtig verstehe, muss ich also in der Implementierung das friend-Schlüsselwort auch noch schreiben, oder? Leider finde ich hierzu in meinem Buch/Unterlagen leider kein Beispiel wo das gezeigt wird an welche Stelle das friend platziert werden muss...</p>
<p>Edit: &quot;friend&quot; darf außerhalb einer Klasse nicht verwendet werden, sagt mein Compiler. Wo ist dann der Fehler?</p>
<p>Das friend den Zugriff auf private Vars/Methoden regelt weiß ich natürlich, deswegen hab ich es ja in der h-Datei auch hingeschrieben <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/2229731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229731</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Tue, 03 Jul 2012 17:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 17:26:18 GMT]]></title><description><![CDATA[<blockquote>
<p>[cpp]class Bitvector<br />
{<br />
...<br />
friend std::ostream&amp; operator &lt;&lt; (std::ostream&amp; output, <strong>Bitvector &amp;bv</strong>);<br />
}; [/cpp]</p>
</blockquote>
<blockquote>
<pre><code class="language-cpp">std::ostream&amp; operator &lt;&lt; (std::ostream &amp;output, const Bitvector &amp;bv)
{
    bv.bits; //hier gibts den Fehler!

return output;
}
</code></pre>
</blockquote>
<p>Das meinte ich. (Steht da doch auch(Hmm.. vielleicht auch etwas mehrdeutig))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229733</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Tue, 03 Jul 2012 17:26:18 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Tue, 03 Jul 2012 17:33:59 GMT]]></title><description><![CDATA[<p>Ich bin blind. Leider. Aber dennoch Danke <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>
<p>Nun hab ich die Überladung um das hier erweitert:</p>
<pre><code class="language-cpp">std::ostream&amp; operator &lt;&lt; (std::ostream &amp;output, const Bitvector &amp;bv)
{
	for(unsigned int i=0; i&lt;=bv.bits; i++)
	{
		if(i == 0)
		{
			output &lt;&lt; bv.getBit(i);  //Fehler
		}
		else if((i%4) == 0)
		{
			output &lt;&lt; &quot; &quot; &lt;&lt; bv.getBit(i);  //Fehler
		}
		else if(i &gt; 0)
		{
			output &lt;&lt; bv.getBit(i);  //Fehler
		}
	}

return output;
}
</code></pre>
<p>Probleme macht nun die getBit()-Methode. Der Compiler sagt: &quot;Fehler 1 error C2662: 'Bitvector::getBit': this-Zeiger kann nicht von 'const Bitvector' in 'Bitvector &amp;' konvertiert werden&quot;</p>
<p>Die getBit()-Methode gibt einen einzelnen char zurück. Wie greife ich korrekt auf Methoden aus Überladungen zu? Es liegt am const, nicht wahr? Muss ich nun die getBit() als const deklarieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229734</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Tue, 03 Jul 2012 17:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Wed, 04 Jul 2012 08:20:47 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Die getBit()-Methode gibt einen einzelnen char zurück. Wie greife ich korrekt auf Methoden aus Überladungen zu? Es liegt am const, nicht wahr? Muss ich nun die getBit() als const deklarieren?</p>
</blockquote>
<p>Ja.</p>
<p>Sag mal: Wie lernst du eigentlich C++? Es sieht nämlich nicht so aus, als hättest du ein schlaues C++ Buch vor dir liegen. Man würde dann erwarten, dass du dann schon <em>viel</em> weiter wärst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229891</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 04 Jul 2012 08:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to Überaldung von &amp;quot;=&amp;quot; on Wed, 04 Jul 2012 08:43:44 GMT]]></title><description><![CDATA[<p>Sag mal, liest du eigentlich das, was der Compiler als Fehlermeldung ausgibt, das, was wir dir sagen und das was in deinem Buch steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229899</guid><dc:creator><![CDATA[Nyme_off]]></dc:creator><pubDate>Wed, 04 Jul 2012 08:43:44 GMT</pubDate></item></channel></rss>