<?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[Kritik und Optimierungen (Klassen mit Operatoroverloading)]]></title><description><![CDATA[<p>Code:</p>
<pre><code class="language-cpp">class CRoute{

		CTypedPtrArray&lt;CPtrArray,CGroup*&gt; m_paNode;

	public:
		//Konstruktor
		CRoute(CGroup *p){
			m_paNode.Add(p);
		}
		CRoute(){}
		//Destruktor
		~CRoute(){
			m_paNode.RemoveAll();
		}
		inline int GetSize() { 
			return m_paNode.GetSize(); 
		}
		inline CGroup* operator[] (size_t iIndex){
			return m_paNode.ElementAt(iIndex);
		}
		/*inline void Add(CGroup *p){
			m_paNode.Add(p);
		}*/
		//Route an Route anhängen!
		void operator+(CRoute *p){
			for(int k=0; k&lt; p-&gt;GetSize(); k++)
				this-&gt;m_paNode.Add((*p)[k]);
		}
		//Gruppe an Route
		void operator+(CGroup *p){
			this-&gt;m_paNode.Add(p);
		}
		//Route zuweisen (Alte Daten werden gelöscht)
		CRoute&amp; operator=(CRoute *p){
			this-&gt;m_paNode.RemoveAll();
			if(p==NULL)
				return *this;
			for(int i=0; i&lt; p-&gt;GetSize(); i++)
				this-&gt;m_paNode.Add((*p)[i]);
			return *this;
		}
		//
		CRoute&amp; operator+=(CRoute *p){
			if(p==NULL)
				return *this;
			for(int k=0; k&lt; p-&gt;GetSize(); k++)
				this-&gt;m_paNode.Add((*p)[k]);
			return *this;
		}
	};
</code></pre>
<p>würde mich freuen wenn ihr euere Meinung und Verbessungsvorschläge hinsichtlich des Code geben würded. Die klasse ist noch nich fertig, will nur wissen ob das mit den operatator overlading richtig ist.</p>
<p>Ich übergeben den operatoren nen Pointer der klasse und nicht eine Referenz auf das Objekt der Klasse. Ist das tragisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179076/kritik-und-optimierungen-klassen-mit-operatoroverloading</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 04:59:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179076.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Apr 2007 10:49:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 10:49:23 GMT]]></title><description><![CDATA[<p>Code:</p>
<pre><code class="language-cpp">class CRoute{

		CTypedPtrArray&lt;CPtrArray,CGroup*&gt; m_paNode;

	public:
		//Konstruktor
		CRoute(CGroup *p){
			m_paNode.Add(p);
		}
		CRoute(){}
		//Destruktor
		~CRoute(){
			m_paNode.RemoveAll();
		}
		inline int GetSize() { 
			return m_paNode.GetSize(); 
		}
		inline CGroup* operator[] (size_t iIndex){
			return m_paNode.ElementAt(iIndex);
		}
		/*inline void Add(CGroup *p){
			m_paNode.Add(p);
		}*/
		//Route an Route anhängen!
		void operator+(CRoute *p){
			for(int k=0; k&lt; p-&gt;GetSize(); k++)
				this-&gt;m_paNode.Add((*p)[k]);
		}
		//Gruppe an Route
		void operator+(CGroup *p){
			this-&gt;m_paNode.Add(p);
		}
		//Route zuweisen (Alte Daten werden gelöscht)
		CRoute&amp; operator=(CRoute *p){
			this-&gt;m_paNode.RemoveAll();
			if(p==NULL)
				return *this;
			for(int i=0; i&lt; p-&gt;GetSize(); i++)
				this-&gt;m_paNode.Add((*p)[i]);
			return *this;
		}
		//
		CRoute&amp; operator+=(CRoute *p){
			if(p==NULL)
				return *this;
			for(int k=0; k&lt; p-&gt;GetSize(); k++)
				this-&gt;m_paNode.Add((*p)[k]);
			return *this;
		}
	};
</code></pre>
<p>würde mich freuen wenn ihr euere Meinung und Verbessungsvorschläge hinsichtlich des Code geben würded. Die klasse ist noch nich fertig, will nur wissen ob das mit den operatator overlading richtig ist.</p>
<p>Ich übergeben den operatoren nen Pointer der klasse und nicht eine Referenz auf das Objekt der Klasse. Ist das tragisch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268282</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Wed, 18 Apr 2007 10:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:00:15 GMT]]></title><description><![CDATA[<p>Erstens: Auf jeden Fall sollten die Operatoren ihre Parameter per Referenz übernehmen <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>Zweitens: operator=() achtet nicht auf Selbstzuweisungen. Eine Anweisung ala &quot;r1=r1;&quot; (die kann sich auch hinter Referenzen/Zeigern verstecken) würde das Objekt löschen.</p>
<p>Drittens: Du solltest op+ lieber global und basierend auf op+= definieren (so wie ich es in deinem letzten Thread mit &amp; und &amp;= angedeutet habe).</p>
<p>PS: Und Methoden, die direkt in der Klassendefinition definiert werden, sind automatisch 'inline' <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/1268298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268298</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:00:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:08:59 GMT]]></title><description><![CDATA[<p>Hi, also ...</p>
<p>1.) Überlege ob du der Ein-Parameter-Konstruktor auch als Umwandlungsfunktion genutzt werden soll, wenn nicht dann explicit machen.</p>
<p>2.) Wenn die Klasse als Basisklasse benutzt wird und Polymorphie auch mit im Spiel ist dann Destruktor virtual machen.</p>
<p>3.) getSize const machen</p>
<p>4.) op[] ne Refernez zurückgeben lassen, damit man nicht derefernzieren muss.</p>
<p>5.) op+ außerhalb der Klasse und const&amp; als Parameter und mit += implementieren und const Objekt zurückgeben lassen.</p>
<p>6.) op= Exceptionsicher machen, dh das Objekt erst ändern wenn alle Aufgaben erfolgreich erledigt wurden. Zuerst nen Temporäres Objekt erzeugen und dann swap und Parameter als const&amp; wieder, oder direkt per Value und dann swap.</p>
<p>7.) Über einen CopyCtor nachdenken.</p>
<p>8.) op+= auch Exceptionsicher machen.</p>
<p>Das wars mal auf die schnelle Vorerst ...</p>
<p>Edit: To slow <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/1268309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268309</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:08:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:07:40 GMT]]></title><description><![CDATA[<p>d.h. wenn ich die parameter per refernez übergeben soll<br />
muss ich später sowas wie bsp.</p>
<pre><code class="language-cpp">CRoute *a=...
Corute *b=...;

(*a)+=(*b);
</code></pre>
<p>umd den zeiger zu defrerenzeiren und dann als obejtk referen übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268310</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:11:33 GMT]]></title><description><![CDATA[<p>Nein, wenn Du die Parameter per Referenz übergibst verhinderst Du lediglich dass eine Kopie erzeugt wird, bzw. stellst sicher dass bei modifizierenden Operatoren auch das Originalobjekt geändert wird und nicht bloß die Kopie. An den Aufrufen ändert sich garnichts.</p>
<p>BTW: Den Vergleich (*a) == (*b) musst Du hier sowieso machen, da a == b ein Zeigervergleich ist und der Vergleich von Builtin-Typen sich nicht überladen lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268314</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:22:55 GMT]]></title><description><![CDATA[<p>also quasie den Pointer per referenz übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268328</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:22:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:27:51 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>d.h. wenn ich die parameter per refernez übergeben soll<br />
muss ich später sowas wie bsp.</p>
<pre><code class="language-cpp">CRoute *a=...
Corute *b=...;

(*a)+=(*b);
</code></pre>
<p>umd den zeiger zu defrerenzeiren und dann als obejtk referen übergeben?</p>
</blockquote>
<p>Warum mußt du denn sowas machen? Im Allgemeinen ist es besser/sicherer, Objekte auf dem Stack abzulegen:</p>
<pre><code class="language-cpp">CRoute a,b;

a+=b;
</code></pre>
<p>PS: Ich weiß nicht, ob du mit Vererbung arbeitest. Wenn nicht, ist ein vector&lt;CGroup&gt; vermutlich einfacher (und auf jeden Fall portabler) als dein CTypedPtrArray.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268329</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 11:59:20 GMT]]></title><description><![CDATA[<p>ja arbeite noch mit MFC... und ich verwende vererbung;) deswegen nehm ich immer CTypedPtrArray:) So bin fertig mit areiten;) ich meld mich morgen wieder ..heheh</p>
<p>grüße und danke (besonders CStoll) <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/1268371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268371</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Wed, 18 Apr 2007 11:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 15:29:03 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>[...] Du solltest op+ lieber global und basierend auf op+= definieren [...]</p>
</blockquote>
<p>Was bringt das?<br />
Ist das schneller oder leichter zu programmieren???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268595</guid><dc:creator><![CDATA[AGS&#x27;ler]]></dc:creator><pubDate>Wed, 18 Apr 2007 15:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Wed, 18 Apr 2007 18:19:39 GMT]]></title><description><![CDATA[<p>AGS'ler schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>[...] Du solltest op+ lieber global und basierend auf op+= definieren [...]</p>
</blockquote>
<p>Was bringt das?<br />
Ist das schneller oder leichter zu programmieren???</p>
</blockquote>
<p>1. Es macht die &quot;offizielle&quot; Schnittstelle der Klasse kleiner, das ist immer positiv, schon aus Gründen der Wartbarkeit.</p>
<p>2. Es ahmt das Verhalten eingebauter Datentypen und derer Operationen besser nach.</p>
<p>3. Es erlaubt, implizite Konversion zu verwenden, um dem Programmierer Arbeit abzunehmen:</p>
<pre><code class="language-cpp">class foo;

foo a, b;
int c;

// Angenommen, folgendes soll gehen:
b = a + c;
// und
b = c + a;

// dann reicht es, den op+ in eine Richtung zu definieren und einen impliziten Konstruktor für foo zu definieren, der ein 'int' als Argument erhält.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1268713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268713</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 18 Apr 2007 18:19:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 02:19:10 GMT]]></title><description><![CDATA[<p>Versteh ich nich: -&gt; Du solltest op+ lieber global und basierend auf op+= definieren!</p>
<p>Folgednes Versteh ich auch nich:</p>
<p><a href="http://1.Es" rel="nofollow">1.Es</a> macht die &quot;offizielle&quot; Schnittstelle der Klasse kleiner, das ist immer positiv, schon aus Gründen der Wartbarkeit.</p>
<p>2. Es ahmt das Verhalten eingebauter Datentypen und derer Operationen besser nach.</p>
<p>3. Es erlaubt, implizite Konversion zu verwenden, um dem Programmierer Arbeit abzunehmen:</p>
<pre><code class="language-cpp">class foo;

foo a, b;
int c;

// Angenommen, folgendes soll gehen:
b = a + c;
// und
b = c + a;

// dann reicht es, den op+ in eine Richtung zu definieren und einen impliziten Konstruktor für foo zu definieren, der ein 'int'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1268897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268897</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 02:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 06:24:51 GMT]]></title><description><![CDATA[<p>Als Ergänzung zu Konrad:</p>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>1. Es macht die &quot;offizielle&quot; Schnittstelle der Klasse kleiner, das ist immer positiv, schon aus Gründen der Wartbarkeit.</p>
</blockquote>
<p>Wenn du etwas an der Semantik der Addition ändern willst, mußt du nur noch eine Funktion (op+=) anpassen - op+ übernimmt deren Verhalten dann automatisch.</p>
<blockquote>
<p>2. Es ahmt das Verhalten eingebauter Datentypen und derer Operationen besser nach.</p>
</blockquote>
<p>Für eingebaute Datentypen (int, double, Zeiger, etc) gilt laut Standard, daß &quot;x+=y;&quot; äquivalent zu &quot;x=x+y;&quot; ist. Indem du op+ über op+= definierst, erreichst du den selben Effekt für deine Klassen. (&quot;do it as the int's&quot; ist ein recht guter Vorsatz bei der Operator-Überladung ;))</p>
<p>(Der umgekehrte Weg, op+= durch op+ zu definieren, wäre zwar auch möglich, aber performance-technisch ungünstiger)</p>
<blockquote>
<p>3. Es erlaubt, implizite Konversion zu verwenden, um dem Programmierer Arbeit abzunehmen:</p>
</blockquote>
<p>Das hat jetzt nicht unbedingt etwas mit op+ vs. op+= zu tun, sondern mit der generellen Entscheidung &quot;Operator global oder als Methode?&quot; Wenn du den Operator als Methode deiner Klasse definierst, kann der Compiler keine Typumwandlungen für den linken Operanden vornehmen, d.h. ein Ausdruck wie <code>T x=4711+y;</code> ist nicht möglich. Bei einem globalen Operator ist der Compiler in der Lage, die 4711 (mit dem Ctor T(int)) in ein T umzuwandeln und dieses zu addieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268931</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 06:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 06:31:26 GMT]]></title><description><![CDATA[<p>aber was ist mit einem GLOBALEN Operator gemeint?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268934</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 06:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 07:03:34 GMT]]></title><description><![CDATA[<p>Du kannst jeden Operator entweder als Memberfunktion <code>T::operator+(const T&amp; rhs);</code> (der linke Operand ist *this) oder als globale Funktion<sup>*</sup> <code>operator+(const T&amp; lhs,const T&amp; rhs)</code> anlegen.</p>
<p><sup>*</sup> mit einigen Ausnahmen - =, [], () und -&gt; dürfen nur als Member angelegt werden (hab ich einen vergessen?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268950</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 07:03:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 07:05:45 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>Folgednes Versteh ich auch nich:</p>
</blockquote>
<p>Hm, wenn man versucht, etwas in Eile zu erklären, geht es halt immer schief. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /> Sorry.</p>
<p>Aber CStoll hat ja im Prinzip schon die Rosinen rausgepickt. <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>CStoll schrieb:</p>
<blockquote>
<p>Für eingebaute Datentypen (int, double, Zeiger, etc) gilt laut Standard, daß &quot;x+=y;&quot; äquivalent zu &quot;x=x+y;&quot; ist. Indem du op+ über op+= definierst, erreichst du den selben Effekt für deine Klassen. (&quot;do it as the int's&quot; ist ein recht guter Vorsatz bei der Operator-Überladung ;))</p>
</blockquote>
<p>AFAIK gab es da auch noch ein paar Nuancen, was das Verhalten von lvalues und rvalues betraf. Weiß ich aber nicht mehr auswendig und campers bezüglichen Beitrag finde ich jetzt auf die Schnelle nicht.</p>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>aber was ist mit einem GLOBALEN Operator gemeint?</p>
</blockquote>
<p>Na, Operatoren, die außerhalb der Klasse definiert wurden.</p>
<pre><code class="language-cpp">class foo { };

foo operator +(foo const&amp; a, foo const&amp; b) {
    foo tmp = a;
    tmp += b;    // hier greifen wir auf foo::operator += zu
    return tmp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1268952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268952</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 19 Apr 2007 07:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 07:48:39 GMT]]></title><description><![CDATA[<p>ok , und wieso kann man:</p>
<pre><code class="language-cpp">foo operator +(foo const&amp; a, foo const&amp; b) {
    foo tmp = a;
    tmp += b;    // hier greifen wir auf foo::operator += zu
    return tmp;
}
</code></pre>
<p>nicht in einer Klasse deklarien? muss es global sein um es zu benutzen? Dachte ich hätte den operator schon mal in einer klasse verwendet!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268971</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 07:48:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 07:58:49 GMT]]></title><description><![CDATA[<p>Klar kannst du den Operator auch in der Klasse definieren (in dem Fall entfällt der erste Parameter und du nutzt *this stattdessen) - der Grund, warum du es nicht tun solltest, sind die impliziten Konvertierungen:</p>
<pre><code class="language-cpp">class myNumber
{
public:
  myNumber(int);
...
  //a:
  myNumber operator+(const myNumber&amp; r);
};

//b:
myNumber operator+(const myNumber&amp; l, const myNumber&amp; r);

...
myNumber a,b,c;

c=a+b;//klappt immer
c=a+1;//klappt auch (wandelt 1 in ein myNumber um und addiert)
c=1+b;//klappt nur mit Variante (b)
c=1+2;//klappt ;) (Bonusfrage: Kannst du mir sagen, welche Operatoren/Methoden hier verwendet werden?)
</code></pre>
<p>Kritisch ist in dem Beispiel die Anweisung <code>c=1+b;</code> - der Compiler darf keine impliziten Umwandlungen für this anwenden, deshalb lässt sich sowas mit dem Member-Operator nicht umsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268979</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 07:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:10:21 GMT]]></title><description><![CDATA[<p>&quot;1+2&quot; : Denk mal globater + operator der foo klasse oder der std. von int</p>
<p>wobei noch der Zuweisungoperator gebruach wird oder? dereiname von Foo auf Foo zuweisen kann , udn von int auf Foo!!</p>
<p>c= a+b;<br />
&quot;a+b&quot; : operator+ (l,r) dann das ergebenis (ab) und &quot;c=ab&quot; operator=(r).</p>
<p>Hier mein code up-to-date:</p>
<pre><code class="language-cpp">class CRoute{

		CTypedPtrArray&lt;CPtrArray,CGroup*&gt; m_paNode;
		int m_i;

	public:
		//Konstruktoren
		CRoute(CGroup *p){
			m_paNode.Add(p);
		}
		CRoute(){
			//Kein Tiefes löschen notwendig da nur Referenzen
			m_paNode.RemoveAll();
		}
		CRoute(CRoute &amp;oScr){
			this-&gt;m_paNode.Append(oScr.m_paNode);
		}
		//Destruktor
		~CRoute(){
			m_paNode.RemoveAll();	
		}
		//Anzahl der knoten in einer Route
		inline int GetSize() const{ 
			return m_paNode.GetSize(); 
		}
		//Zugriff auf elemente der Route über Index		
		inline CGroup&amp; CRoute::operator[] (const size_t iIndex){
			return *(m_paNode.ElementAt(iIndex));
		}
		//Route an Route anhängen!
		void CRoute::operator+(CRoute *&amp;p){
			for(int k=0; k&lt; p-&gt;GetSize(); k++)
				this-&gt;m_paNode.Add(&amp;((*p)[k]));
		}
		//Knoten an Route anhängen
		void CRoute::operator+(CGroup *&amp;p){
			this-&gt;m_paNode.Add(p);
		}
		/*Route einer anderne Route zuweisen (Tiefe Kopie nich notwendige, da die Routen nur auf
		Knoten des Baumen zeigen*/
		CRoute&amp; CRoute::operator=(/*const*/ CRoute &amp;oScr){
			if(&amp;oScr== this)
				return *this;
			ASSERT(&amp;oScr!=NULL);
			this-&gt;m_paNode.RemoveAll();
			for(int i=0; i&lt; oScr.GetSize(); i++)
				this-&gt;m_paNode.Add(&amp;(oScr[i]));
			return *this;
		}
		//Route an vorhanden Route anfügen
		CRoute&amp; CRoute::operator+=(/*const*/ CRouteSector::CRoute &amp;oScr){
			if(&amp;oScr==NULL)
				return *this;
			for(int k=0; k&lt; oScr.GetSize(); k++)
				this-&gt;m_paNode.Add(&amp;(oScr[k]));
			return *this;
		}
		//Route an vorhanden Route anfügen
		CRoute&amp; CRoute::operator+=(CGroup &amp;oScr){
			if(&amp;oScr==NULL)
				return *this;
			//for(int k=0; k&lt; oScr.GetSize(); k++)
			this-&gt;m_paNode.Add(&amp;oScr);
			return *this;
		}
		//Route ausgeben
		void DEBUG_TRACEOUT(){
			TRACE(&quot;Pfad ADR.: %i\n&quot;,(int)this);
			for(int i=0; i&lt; this-&gt;GetSize(); i++){
				CGroup *p =this-&gt;m_paNode.ElementAt(i);
				TRACE(&quot;ADR.: %i NODE: %s\n&quot;, (int)p, p-&gt;GetName()); 
			}
		}
	};
</code></pre>
<p>wenn ich const bei den übergabeparameter anfeben (siehe /* const */) kommst aber immer der compilerfehler : d:\Multithreading\multithread\multithread\ProcGraph.h(368): error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const CRouteSector::CRoute' (or there is no acceptable conversion)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268981</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:19:50 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>&quot;1+2&quot; : Denk mal globater + operator der foo klasse oder der std. von int</p>
</blockquote>
<p>Fast richtig: &quot;c=1+2;&quot; verwendet (in dieser Reihenfolge) den op+ für int's (eingebaut), den Ctor myNumber(int) und den op= (entweder von dir geschrieben oder implizit angelegt)</p>
<blockquote>
<p>wenn ich const bei den übergabeparameter anfeben (siehe /* const */) kommst aber immer der compilerfehler : d:\Multithreading\multithread\multithread\ProcGraph.h(368): error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const CRouteSector::CRoute' (or there is no acceptable conversion)</p>
</blockquote>
<p>Vielleicht solltest du auch eine const-Version deines operator[] bereitstellen <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/1268994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268994</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:25:39 GMT]]></title><description><![CDATA[<p>oh man das versteh ich nich mit den const. ich weis zwar was sie bedeuten, aber in welchem zusammmenhang sie hinsichtlich der funltionen udn operatoren stehen müssen ist so ein wirrwarr..</p>
<p>Trozdem noch mal ein Dankeschön zwischendruch an CStoll:) Kommst dir sicher vor wie im kindergarten:)</p>
<p>du meinst:</p>
<pre><code class="language-cpp">//Zugriff auf elemente der Route über Index        
        inline const CGroup&amp; CRoute::operator[] (const size_t iIndex){
            return *(m_paNode.ElementAt(iIndex));
        }
</code></pre>
<p>??</p>
<p>kann ich dann überhaupt nicht const Objekte der klasse CRoute an die funltionen übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268996</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:25:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:29:54 GMT]]></title><description><![CDATA[<p>Nein, ich meinte</p>
<pre><code class="language-cpp">inline CGroup CRoute::operator[] (size_t iIndex) const
{
    return *(m_paNode.ElementAt(iIndex));
}
</code></pre>
<p>(an dieser Stelle gilt das const für *this - und bewirkt letztendlich, daß du den Operator auf 'const CRoute' Objekte anwenden darfst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268999</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:32:53 GMT]]></title><description><![CDATA[<p>ok dann hab ich die const dinge doch nich so verstanden:</p>
<p>wenn ich die parameter des operator:</p>
<pre><code class="language-cpp">CRoute&amp; CRoute::operator=(/*const*/ CRoute &amp;oScr){ ..}
</code></pre>
<p>const übergebe,<br />
undc ich später:</p>
<pre><code class="language-cpp">CRoute a;

CRoute b;

a=b;
</code></pre>
<p>dann ist ja b nicht const oder???? aber der opertor erwarte ein const!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269001</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:32:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:39:28 GMT]]></title><description><![CDATA[<p>Ein nicht-konstantes Objekt kann problemlos als konstantes Objekt angesehen werden (umgekehrt gilt das nicht). Das heißt, für den <code>operator=(const CRoute&amp; oSrc);</code> ist das übergebene Objekt konstant (und daß du letztendlich die Möglichkeit hättest, dieses Objekt in anderen Teilen des Programms zu ändern, ist ihm egal). Also darf er auch nur Methoden des Objekts aufrufen, die es nicht verändern dürfen.</p>
<p>Dabei ist es dem Compiler egal, was du wirklich in der Methode machst (das könnte sich ja später ändern). Wichtig ist nur die Deklaration - mit dem const hinter der Parameterliste sagst du dem Compiler, daß diese Methode ihr this-Objekt nicht ändern wird (und wenn sie es doch macht, warnt dich der Compiler).</p>
<p>PS: Du hast dir aber einiges vorgenommen <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/1269005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269005</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:40:28 GMT]]></title><description><![CDATA[<p>Du kannst ein non-const Objekt jederzeit in ein konstantes Objekt implizit umwandeln. Macht ja auch Sinn, denn const sagt ja aus dass das Objekt nicht geändert wird - und es spricht nichts dagegen ein änderbares Objekt nicht zu ändern <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="😃"
    /></p>
<p>Umgekehrt funktioniert es nicht - ein konstantes Objekt kann nicht geändert werden und auch nicht ohne böse Casts in ein non-const Objekt umgewandelt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269006</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:58:45 GMT]]></title><description><![CDATA[<p>aha, dann sag ich dem compiler nur das ich das obejekt in der funktion (operator) nich ändern werde.. aber was bringt ihm das?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Ja nehm mir immer viel vor. Bin ein kleiner Perfektionist. Wenn was nich geht will ich wissen warum, und wenn was geht auch;)</p>
<p>Und leider klappt das mit dem Konst nich. das MFC Array hat was dageggen wenn ich den operator[] (..) const {..} schreibe:</p>
<pre><code class="language-cpp">d:\Multithreading\multithread\multithread\ProcGraph.h(544): error C2662: 'CTypedPtrArray&lt;BASE_CLASS,TYPE&gt;::ElementAt' : cannot convert 'this' pointer from 'const CTypedPtrArray&lt;BASE_CLASS,TYPE&gt;' to 'CTypedPtrArray&lt;BASE_CLASS,TYPE&gt; &amp;'
        with
        [
            BASE_CLASS=CPtrArray,
            TYPE=CGroup *
        ]
        and
        [
            BASE_CLASS=CPtrArray,
            TYPE=CGroup *
        ]
        and
        [
            BASE_CLASS=CPtrArray,
            TYPE=CGroup *
        ]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1269019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269019</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kritik und Optimierungen (Klassen mit Operatoroverloading) on Thu, 19 Apr 2007 08:59:37 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>aber was bringt ihm das?</p>
</blockquote>
<p>Nunja, am wichtigsten: Wenn das Objekt selbst bereits konstant ist, weiss er dass Du die Methode trotzdem aufrufen darfst.</p>
<p>Nicht weniger wichtig, aber für den Programmierer vielleicht in erster Linie nicht so interessant: Optimierungspotenzial.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269024</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 19 Apr 2007 08:59:37 GMT</pubDate></item></channel></rss>