<?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[Überladen von Operatoren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe von oben genanntem Thema anscheined noch etwas nicht verstanden.....<br />
Wenn ich einen Operator in meiner Header datei überladen möchte,<br />
funktioniert das so wunderbar:</p>
<pre><code class="language-cpp">Vector operator = (const Vector &amp;v)	{x = v.x; y = v.y; z = v.z; return *this;}
</code></pre>
<p>warum meckert er wenn ich ihm mehr als zwei Parameter geben möchte, wie z.B.</p>
<pre><code class="language-cpp">Vector operator + (const Vector &amp;a, const Vector &amp;b)	{a.x + b.x, a.y + b.y, a.z + b.z; return *this;}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/294802/überladen-von-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 17:20:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294802.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Nov 2011 19:13:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:13:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe von oben genanntem Thema anscheined noch etwas nicht verstanden.....<br />
Wenn ich einen Operator in meiner Header datei überladen möchte,<br />
funktioniert das so wunderbar:</p>
<pre><code class="language-cpp">Vector operator = (const Vector &amp;v)	{x = v.x; y = v.y; z = v.z; return *this;}
</code></pre>
<p>warum meckert er wenn ich ihm mehr als zwei Parameter geben möchte, wie z.B.</p>
<pre><code class="language-cpp">Vector operator + (const Vector &amp;a, const Vector &amp;b)	{a.x + b.x, a.y + b.y, a.z + b.z; return *this;}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2138917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138917</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:22:42 GMT]]></title><description><![CDATA[<p>Weil operator+ als Memberfunktion mit zwei Argumenten nicht existiert. Es braucht diese 2 Argumente auch nicht.</p>
<p>Wenn du x,y, z als Objekte der Klasse Vector hast.<br />
Dann wird<br />
z = x + y;<br />
ausgewertet zu<br />
z = x.operator+(y);<br />
Das heisst die Funktion wird auf dem ersten Objekt aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2138922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138922</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:22:42 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:22:46 GMT]]></title><description><![CDATA[<p>Bei jedem Operator ist festgelegt, wie viele Operanden er benötigt. operator+ ist ein binärer Operator, d.h. er braucht zwei Operanden. Wenn du ihn allerdings innerhalb einer Klasse definierst, ist this bereits ein Operand, d.h. du hast drei Operanden. Du kannst nun einen Parameter wegwerfen oder, was besser ist, den Operator als freie Funktion definieren. Einen guten Artikel zum Überladen von Operatoren gibts im Magazin: <a href="http://www.c-plusplus.net/forum/232010" rel="nofollow">http://www.c-plusplus.net/forum/232010</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2138923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138923</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:22:46 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:23:45 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>warum meckert er wenn ich ihm mehr als zwei Parameter geben möchte, wie z.B.</p>
</blockquote>
<p>Weil innerhalb der Klasse deklariert es in wirklichkeit 3 Parameter sind, this wird ja auch (unsichtbar) übergeben.<br />
Raus aus der Klasse und drunterschreiben.</p>
<pre><code class="language-cpp">class Vector{
...
};
Vector operator + (const Vector &amp;a, const Vector &amp;b)	{Vector c; c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; return c;}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2138925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138925</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:23:45 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:41:50 GMT]]></title><description><![CDATA[<p>Innerhalb von der Klasse würde es von der Syntax her dann so aussehen?</p>
<pre><code class="language-cpp">Vector operator + (const Vector &amp;a) {
	x + operator + (a.x); 
	y + operator + (a.y);
	z + operator + (a.z);
	return *this;

}
</code></pre>
<p>ich frage extra weil</p>
<pre><code class="language-cpp">Vector operator + (const Vector &amp;a) {
       x = x.operator + (a.x);
       .....
}
</code></pre>
<p>funktioniert net^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2138932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138932</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:41:42 GMT]]></title><description><![CDATA[<p>Nein, du solltest keinen der Operanden bei operator+ verändern. Wär ja auch komisch, wenn man bei c = b + a auf einmal b verändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2138940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138940</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Tue, 01 Nov 2011 19:46:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Vector operator + (const Vector &amp;a) {
	x + a.x;
	y + a.y;
	z + a.z;
	return *this;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2138944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138944</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Tue, 01 Nov 2011 19:46:17 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 06:22:29 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Vector operator + (const Vector &amp;a) {
	x + a.x;
	y + a.y;
	z + a.z;
	return *this;
	
}
</code></pre>
</blockquote>
<p>Ganz großer Blödsinn. Der Operator tut nichts und gibt nur eine Kopie von *this zurück - ohne dass sich irgendwas ändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139103</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 Nov 2011 06:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 07:20:11 GMT]]></title><description><![CDATA[<p>Ich schwöre, gestern hat es nicht funktioniert -.-</p>
<p>Jetzt schon....</p>
<pre><code class="language-cpp">Vector Vector::operator + (const Vector &amp;v) {
    x = x + v.x;
    ......
</code></pre>
<p>aber schon gehts weiter:</p>
<p>wenn ich jetzt biespielsweise eine Operator überladung vorgenommen habe wie diese:</p>
<pre><code class="language-cpp">Vector Vector::operator / (const float f) {
	x = x / f;
	y = y / f;
	z = z / f;
	return *this;
}
</code></pre>
<p>Wieso kann das Programm dann das hier nicht?</p>
<pre><code class="language-cpp">// to normalize a vector (lenth 1)
Vector Vector::VectorNormalize(const Vector &amp;v)	{
	return v / sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
}
</code></pre>
<p>da steht ja dann nix anderes als Vector / float<br />
da hab ich ihm ja schon gesagt was er damit machen soll<br />
nämlich</p>
<p>x/f<br />
y/f<br />
z/f</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139104</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 07:20:11 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:02:04 GMT]]></title><description><![CDATA[<p>dein Operator / verändert in der Rechnung Vector a = v / 9.f; v und das darf nicht sein.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139177</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:14:49 GMT]]></title><description><![CDATA[<p>Aber wenn ich ne lokale kopie erzeuge, dann ist die hinterher nicht mehr gültig....<br />
Wenn ich nen Vektor in die Methode stecke, und ihn normalisieren möchte, dann will ich doch das v verändert wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139186</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:36:57 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>Aber wenn ich ne lokale kopie erzeuge, dann ist die hinterher nicht mehr gültig....</p>
</blockquote>
<p>Natürlich ist sie gültig, wenn du sie zurückgibst. Schau dir nochmal den von mir geposteten Link an, wie man die Operatoren standardmäßig implementiert.</p>
<blockquote>
<p>Wenn ich nen Vektor in die Methode stecke, und ihn normalisieren möchte, dann will ich doch das v verändert wird...</p>
</blockquote>
<p>Beim Normalisieren kann man drüber streiten, aber bei c = a + b erwartet keiner, dass a verändert wird (ich wiederhole mich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139198</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:48:51 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Lybrial schrieb:</p>
<blockquote>
<p>Aber wenn ich ne lokale kopie erzeuge, dann ist die hinterher nicht mehr gültig....</p>
</blockquote>
<p>Natürlich ist sie gültig, wenn du sie zurückgibst. Schau dir nochmal den von mir geposteten Link an, wie man die Operatoren standardmäßig implementiert.</p>
<blockquote>
<p>Wenn ich nen Vektor in die Methode stecke, und ihn normalisieren möchte, dann will ich doch das v verändert wird...</p>
</blockquote>
<p>Beim Normalisieren kann man drüber streiten, aber bei c = a + b erwartet keiner, dass a verändert wird (ich wiederhole mich).</p>
</blockquote>
<blockquote>
<p>3.2 operator+, -, *, /, %</p>
<p>Semantik: Addition, Subtraktion, Multiplikation, Division, Modulo. Es wird ein neues Objekt mit dem Ergebniszustand erzeugt. Die folgenden Ausführungen gelten jeweils analog für -, *, / und %.<br />
Übliche Deklaration:</p>
<p>C/C++ Code:<br />
const X operator+(X const&amp; lhs, X const&amp; rhs);<br />
C/C++ Code:<br />
const X operator+(X const&amp; lhs, X const&amp; rhs);</p>
<p>Übliche Implementierung:</p>
<p>C/C++ Code:<br />
const X operator+(X const&amp; lhs, X const&amp; rhs)<br />
{<br />
/* Erzeugen eines neuen Objektes, dessen Attribute gezielt einzeln gesetzt werden. Oder: */<br />
X tmp(lhs); //Kopie des linken Operanden<br />
tmp += rhs; //Implementierung mittels des +=-Operators<br />
return tmp;<br />
}<br />
C/C++ Code:<br />
const X operator+(X const&amp; lhs, X const&amp; rhs)<br />
{<br />
/* Erzeugen eines neuen Objektes, dessen Attribute gezielt einzeln gesetzt werden. Oder: */<br />
X tmp(lhs); //Kopie des linken Operanden<br />
tmp += rhs; //Implementierung mittels des +=-Operators<br />
return tmp;<br />
}</p>
<p>In vielen Fällen macht das Vorhandensein des operator+ auch die Existenz des operator+= sinnvoll, um die kürzere Schreibweise a += b an Stelle von a = a + b zu ermöglichen. Um das Verhalten beider Operatoren konsistent zu halten ist es daher üblich, operator+ im Sinne von operator+= zu implementieren wie gezeigt. Um eine implizite Typumwandlung des ersten Operanden zu ermöglichen werden die binären arithmetischen Operatoren üblicherweise als freie Funktionen definiert.<br />
Wird der Operator nicht mittels operator+= implementiert, benötigt er meist Zugriff auf private Attribute von X. In dem Fall wird er häufig als friend der Klasse deklariert oder greift auf eine öffentliche Methode der Klasse zu, die die eigentliche Operation ausführt:</p>
<p>C/C++ Code:<br />
const X X::plus(X const&amp; rhs) const; //Implementiert die Addition<br />
const X operator+(X const&amp; lhs, X const&amp; rhs)<br />
{<br />
return lhs.plus(rhs);<br />
}<br />
C/C++ Code:<br />
const X X::plus(X const&amp; rhs) const; //Implementiert die Addition<br />
const X operator+(X const&amp; lhs, X const&amp; rhs)<br />
{<br />
return lhs.plus(rhs);<br />
}</p>
</blockquote>
<p>Das ist die betreffende Stelle, allerdings werden hier für operator + zwei Parameter reingesteckt, was garnicht möglich ist wenn man sie (wie es sauberes programmieren ist) außerhalb der Klasse definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139203</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:50:41 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>Das ist die betreffende Stelle, allerdings werden hier für operator + zwei Parameter reingesteckt, was garnicht möglich ist wenn man sie (wie es sauberes programmieren ist) außerhalb der Klasse definiert.</p>
</blockquote>
<p>Doch, als freie Funktion benötigt operator+ genau zwei Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139204</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 09:59:24 GMT]]></title><description><![CDATA[<p>Error: &quot;must take either zero or one argument&quot;</p>
<p>Tritt im Header auf, dort ist die Überladung deklariert<br />
und im entsprechenden cpp File definiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139208</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 09:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:00:05 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>Error: &quot;must take either zero or one argument&quot;</p>
<p>Tritt im Header auf, dort ist die Überladung deklariert<br />
und im entsprechenden cpp File definiert!</p>
</blockquote>
<p>Glaub ich dir nicht. Hast du den Operator innerhalb einer Klasse deklariert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139210</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:11:21 GMT]]></title><description><![CDATA[<p>Ja!</p>
<pre><code class="language-cpp">class lCVector3 {					

	public:
		struct {
			float x;
			float y;
			float z;
		};							// coords

		lCVector3();													// standart
		lCVector3(const lCVector3 &amp;v);									// copy
		lCVector3(const float f);										// normal each element, same number
		lCVector3(const float _x, const float _y, const float _z);		// normal each element, different number
		lCVector3(const float *pfComponent);							// normal array with three elements

		// operation assignments
		lCVector3 operator = (const lCVector3 &amp;v);
		lCVector3 operator += (const lCVector3 &amp;v);
		lCVector3 operator -= (const lCVector3 &amp;v);
		lCVector3 operator *= (const lCVector3 &amp;v);
		lCVector3 operator *= (const float f);
		lCVector3 operator /= (const lCVector3 &amp;v);
		lCVector3 operator /= (const float f);

		// arithmetical operations
		lCVector3 operator + (const lCVector3 &amp;v);
		lCVector3 operator - (const lCVector3 &amp;v);
		lCVector3 operator * (const lCVector3 &amp;v);
		lCVector3 operator * (const float f);
		lCVector3 operator / (const lCVector3 &amp;v);
		lCVector3 operator / (const float f);

		// compare operations
		bool operator == (const lCVector3 &amp;v);
		bool operator != (const lCVector3 &amp;v);

		// function declaration
		float		lCVector3Length(const lCVector3 &amp;v);
		float		lCVector3LengthSq(const lCVector3 &amp;v);
		lCVector3	lCVector3Normalize(const lCVector3 &amp;v);
		lCVector3	lCVector3NormalizeEx(const lCVector3 &amp;v);
		lCVector3	lCVector3Cross(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
		float		lCVector3Point(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
		float		lCVector3Angle(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
		lCVector3	lCVector3InterpolateCoords(const lCVector3 &amp;v1, const lCVector3 &amp;v2, const float p);
		lCVector3	lCVector3InterpolateNormal(const lCVector3 &amp;v1, const lCVector3 &amp;v2, const float p);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2139213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139213</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:05:44 GMT]]></title><description><![CDATA[<p>Dann zitier ich dich mal selbst:</p>
<blockquote>
<p>wenn man sie (wie es sauberes programmieren ist) außerhalb der Klasse definiert.</p>
</blockquote>
<p>Ansonsten haben dir auch schon genug Leute gesagt, dass der Operator als freie Funktion definiert werden soll und eben nicht in einer Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139215</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:07:46 GMT]]></title><description><![CDATA[<p>Man deklariert innerhalb der Klasse<br />
und definiert außerhalb.</p>
<p>Ist doch normal.....</p>
<p>Und genau so hab ichs gemacht,<br />
sehe dir den letzten Post von mir an, da hab ich<br />
mal den header gepostet, alles nur deklarationen<br />
nix definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139216</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:11:34 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>Man deklariert innerhalb der Klasse<br />
und definiert außerhalb.</p>
</blockquote>
<p>Nein, eine Funktion ist entweder innerhalb einer Klasse deklariert und definiert oder außerhalb. Beides gibts nicht. Du hast die Definition der Funktion einfach nur räumlich getrennt von der Klassendefinition, aber die Signatur der Funktionsdefinition sagt ganz klar, dass die Funktion zur Klasse gehört.</p>
<pre><code class="language-cpp">class Foo
{
    void bar();
}

void Foo::bar()    // bar gehört zu Foo
{
}

void baz()    // freie Funktion
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2139219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139219</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:15:30 GMT]]></title><description><![CDATA[<p>Versteh ich jetzt nicht ganz, funktioniert es dann grundsätzlich nicht<br />
wenn man das so macht oder ist das nur &quot;unschön&quot;</p>
<p>Ein Beispiel das ich gemacht habe, eine Log-Klasse:</p>
<p>Header</p>
<pre><code class="language-cpp">#ifndef __LOGHANDLER
#define __LOGHANDLER

#include &lt;stdio.h&gt;
#include &quot;Singleton.hpp&quot;

enum LOGLEVEL {
    L_OK,
    L_ERROR,
    L_FATAL_ERROR,
    L_INFO
	L_WARN
	L_DEBUG
};

class CLogHandler : public TSingleton&lt;CLogHandler&gt; {

    public:
        CLogHandler();                                                                       //constructor
        ~CLogHandler();                                                                      //destructor
        void createLogHandler(const char *LogName);                                          //new logfile
        void message(const char *File, int Line, const char *Time, const char *msg, LOGLEVEL level); //writes message into logfile

    private:
        FILE *m_Logfile;                                                                     //the FILE ;)
        const char* convertEnum(LOGLEVEL level);                                             //to convert the enums ;)
};

#endif
</code></pre>
<p>die cpp dazu, in der die Methoden definiert sind:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &quot;LogHandler.hpp&quot;

using namespace std;

//constructor
CLogHandler::CLogHandler(){};

//destructor
CLogHandler::~CLogHandler(){
    message(__FILE__, __LINE__, __TIME__,&quot;End of logfile!&quot;, L_INFO);
    fclose(m_Logfile);
}

//create logfile and write head
void CLogHandler::createLogHandler(const char *LogName) {

    try {
        m_Logfile = fopen(LogName, &quot;w&quot;);//fopen = fileopen, w = write

        if (m_Logfile == NULL) {
            throw &quot;Datei konnte nicht geoeffnet werden!&quot;;
        }
    } catch (char *ErrorString) {
        cout &lt;&lt; &quot;Fehler aufgetreten: &quot; &lt;&lt; ErrorString &lt;&lt; endl;
        cout &lt;&lt; &quot;Programm wird beendet!&quot; &lt;&lt; endl;
        exit(0);
    }

    message(__FILE__, __LINE__, __TIME__, &quot;THIS IS THE LOGFILE!!!&quot;, L_INFO);

    //print out actual build-configuration
    #ifdef _DEBUG
        message(__FILE__, __LINE__, __TIME__, &quot;BUILD: DEBUG&quot;, L_INFO);
    #else
        message(__FILE__, __LINE__, __TIME__, &quot;BUILD: RELEASE&quot;, L_INFO);
    #endif

    //close logfile and open it again with append
    fclose(m_Logfile);
    try {
        m_Logfile = fopen(LogName, &quot;a&quot;);//fopen = fileopen, a = append

        if (m_Logfile == NULL) {
            throw &quot;Datei konnte nicht geoeffnet werden!&quot;;
        }
    } catch (char *ErrorString) {
        cout &lt;&lt; &quot;Fehler aufgetreten: &quot; &lt;&lt; ErrorString &lt;&lt; endl;
        cout &lt;&lt; &quot;Programm wird beendet!&quot; &lt;&lt; endl;
        exit(0);
    }
}

//message method to print a message into the logfile with LOGLEVEL
void CLogHandler::message(const char *File, int Line, const char *Time, const char *msg, LOGLEVEL level) {
    fprintf(m_Logfile,&quot;[&lt;%s&gt; - &lt;%s&gt;] at: &lt;%20s&gt;: &lt;%d&gt; &lt;%s&gt;\n&quot;, convertEnum(level), Time, File, Line, msg);
    fflush(m_Logfile);//forces instantly writing into the file
}

const char* CLogHandler::convertEnum(LOGLEVEL level) {
    switch(level) {
        case L_OK: return &quot;INFO &quot;; break;
        case L_ERROR: return &quot;ERROR&quot;; break;
        case L_FATAL_ERROR: return &quot;FATAL&quot;; break;
        case L_INFO: return &quot;INFO &quot;; break;
		case L_WARN: return &quot;WARN &quot;; break;
		case L_DEBUG: return &quot;DEBUG&quot;; break;
        default: return &quot;INFO &quot;; break;
    }
}
</code></pre>
<p>und das funktioniert herrlich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139222</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:22:21 GMT]]></title><description><![CDATA[<p>Mal noch ein paar andere Sachen:</p>
<pre><code class="language-cpp">class lCVector3 {
</code></pre>
<p>Schrecklicher Name. Was sollen l und C bedeuten?</p>
<pre><code class="language-cpp">struct {
			float x;
			float y;
			float z;
		};							// coords
</code></pre>
<p>Warum packst du das in ein struct? Warum benutzt du float statt double?</p>
<pre><code class="language-cpp">l		lCVector3(const lCVector3 &amp;v);									// copy
</code></pre>
<p>Wofür musst du diesen Konstruktor explizit definieren? Danke an die Regel der großen Drei.</p>
<pre><code class="language-cpp">lCVector3(const float f);										// normal each element, same number
</code></pre>
<p>Was soll &quot;normal&quot; bedeuten? Komischer Satz</p>
<pre><code class="language-cpp">lCVector3(const float *pfComponent);							// normal array with three elements
</code></pre>
<p>Schlechter Stil. Übergib ein std::array, wenns denn unbedingt sein muss, Hauptsache du hast eine sinnvolle Größenüberprüfung.</p>
<pre><code class="language-cpp">// operation assignments
		lCVector3 operator = (const lCVector3 &amp;v);
</code></pre>
<p>Siehe Kommentar zum Copy-Konstruktor.</p>
<pre><code class="language-cpp">lCVector3 operator *= (const lCVector3 &amp;v);
</code></pre>
<p>Wie ist die Multiplikation von zwei Vektoren definiert?</p>
<pre><code class="language-cpp">lCVector3 operator /= (const lCVector3 &amp;v);
</code></pre>
<p>Wie ist die Division von zwei Vektoren definiert?</p>
<pre><code class="language-cpp">// arithmetical operations
		lCVector3 operator + (const lCVector3 &amp;v);
		lCVector3 operator - (const lCVector3 &amp;v);
		lCVector3 operator * (const lCVector3 &amp;v);
		lCVector3 operator * (const float f);
		lCVector3 operator / (const lCVector3 &amp;v);
		lCVector3 operator / (const float f);

		// compare operations
		bool operator == (const lCVector3 &amp;v);
		bool operator != (const lCVector3 &amp;v);
</code></pre>
<p>Als freie Funktionen definieren.</p>
<pre><code class="language-cpp">// function declaration
		float		lCVector3Length(const lCVector3 &amp;v);
		float		lCVector3LengthSq(const lCVector3 &amp;v);
		lCVector3	lCVector3Normalize(const lCVector3 &amp;v);
		lCVector3	lCVector3NormalizeEx(const lCVector3 &amp;v);
</code></pre>
<p>Schlechte Namen, was soll lCVector3? Warum kürzt du die wesentlichen Teile ab? Ich weiß nicht, was du mit NormaliseEx meinst.</p>
<pre><code class="language-cpp">lCVector3	lCVector3Cross(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
		float		lCVector3Point(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
		float		lCVector3Angle(const lCVector3 &amp;v1, const lCVector3 &amp;v2);
</code></pre>
<p>Hier hast du wiederum drei Parameter, nämlich this, v1 und v2. Was ist das Kreuzprodukt dreier Vektoren? Point ist ein schlechter Name, den versteht man nur, weil Cross direkt drübersteht.</p>
<pre><code class="language-cpp">lCVector3	lCVector3InterpolateCoords(const lCVector3 &amp;v1, const lCVector3 &amp;v2, const float p);
		lCVector3	lCVector3InterpolateNormal(const lCVector3 &amp;v1, const lCVector3 &amp;v2, const float p);
</code></pre>
<p>Hiermit dasselbe. Die Namen sind auch ziemlich nichtssagen.d</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139227</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:26:53 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>Versteh ich jetzt nicht ganz, funktioniert es dann grundsätzlich nicht<br />
wenn man das so macht oder ist das nur &quot;unschön&quot;</p>
</blockquote>
<p>Lies dir dazu bitte nochmal den entsprechenden Abschnitt in deinem Buch durch. Ich denke, wenn du dir meine Erklärung nochmal langsam durchliest, solltest du es auch so verstehen.</p>
<blockquote>
<p>Ein Beispiel das ich gemacht habe, eine Log-Klasse:</p>
</blockquote>
<p>Hier sind wieder so viele verbesserungswürdige Sachen drin... Wieso hast du eine Funktion createLogHandler, die die Aufgabe des Konstruktors übernimmt, während der Konstruktor gar nichts macht? Wieso erbst du von Singleton? Und so weiter, das geh ich nicht auch noch alles durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139229</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 10:55:38 GMT]]></title><description><![CDATA[<p>Danke für deine Tipps, sowas mag ich sehr gerne, mein ich ernst <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>Aber zur Log-Klasse:</p>
<p>Erbt von Singleton weil ich Singleton als Template Klasse schon implementiert hatte und meine Log-Klasse nur einmal exisitieren soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139239</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:55:38 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 11:02:24 GMT]]></title><description><![CDATA[<p>Lybrial schrieb:</p>
<blockquote>
<p>DErbt von Singleton weil ich Singleton als Template Klasse schon implementiert hatte und meine Log-Klasse nur einmal exisitieren soll.</p>
</blockquote>
<p>Und warum musst du im Code garantieren, dass nur eine Instanz erstellt werden kann? Deine Implementierung der Klasse passt übrigens gar nicht zum Singleton-Pattern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139249</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 11:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von Operatoren on Wed, 02 Nov 2011 11:14:40 GMT]]></title><description><![CDATA[<p>Ok und warum nicht?<br />
So lange bin ich noch nicht in C++ um alles zu wissen aber über Tips freue ich mich. (Genau gesagt bin ich seid zwei Wochen an C++)</p>
<p>wenn ich das ganze so mache um zurück zu Vektor-Klasse zu kommen funzts:</p>
<pre><code class="language-cpp">Vector Vector::operator + (const Vector &amp;v) {
	Vector *v1 = new Vector(x + v.x, y + v.y, z + v.z);
	return *v1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2139256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139256</guid><dc:creator><![CDATA[Lybrial]]></dc:creator><pubDate>Wed, 02 Nov 2011 11:14:40 GMT</pubDate></item></channel></rss>