<?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[Frage zur Überladung von Vergleichsoperatoren einer Klasse.]]></title><description><![CDATA[<p>Moin,<br />
ich glaube ich stehe hier gerade vor einem Problem und zwar:</p>
<p>*- ich habe eine Klasse geschrieben, die einen x und einen y Wert als Eigenschaft besitzt</p>
<p>- ich habe eine zweite Klasse die die Eigenschaften der ersten Klasse grafisch darstellen soll und dazu aber den größten x und y Wert der Klasse benötigt*</p>
<p>Jetzt wollte ich den &quot;größer als&quot; Vergleichsoperator der ersten Klasse Überladen, ungefähr so:</p>
<pre><code class="language-cpp">bool operator&gt;( const Class1 *c1 ) {

    return( this-&gt;xValue &gt; c1-&gt;xValue );
}
</code></pre>
<p>Wenn ich das gleiche Spiel noch einmal für den y Wert mache, weiß der Compiler dann auch für welchen der beiden Werte er den Vergleich anstellen soll?</p>
<p>Oder kann ich das dann so schreiben:</p>
<p>c1.xValue &gt; c2.xValue und c1.yValue &gt; c2.yValue</p>
<p>So wär es ja dann klar.</p>
<p>Aller dings kann ich dies ja nicht noch mal ein 2. Mal definieren. Hm..?<br />
Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201460/frage-zur-überladung-von-vergleichsoperatoren-einer-klasse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 21:52:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201460.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Dec 2007 10:59:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 11:09:57 GMT]]></title><description><![CDATA[<p>Moin,<br />
ich glaube ich stehe hier gerade vor einem Problem und zwar:</p>
<p>*- ich habe eine Klasse geschrieben, die einen x und einen y Wert als Eigenschaft besitzt</p>
<p>- ich habe eine zweite Klasse die die Eigenschaften der ersten Klasse grafisch darstellen soll und dazu aber den größten x und y Wert der Klasse benötigt*</p>
<p>Jetzt wollte ich den &quot;größer als&quot; Vergleichsoperator der ersten Klasse Überladen, ungefähr so:</p>
<pre><code class="language-cpp">bool operator&gt;( const Class1 *c1 ) {

    return( this-&gt;xValue &gt; c1-&gt;xValue );
}
</code></pre>
<p>Wenn ich das gleiche Spiel noch einmal für den y Wert mache, weiß der Compiler dann auch für welchen der beiden Werte er den Vergleich anstellen soll?</p>
<p>Oder kann ich das dann so schreiben:</p>
<p>c1.xValue &gt; c2.xValue und c1.yValue &gt; c2.yValue</p>
<p>So wär es ja dann klar.</p>
<p>Aller dings kann ich dies ja nicht noch mal ein 2. Mal definieren. Hm..?<br />
Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427978</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 11:34:40 GMT]]></title><description><![CDATA[<p>Wenn du mit den Funktionen der Standard-Library arbeiten willst, dann solltest du den Kleiner-Als-Operator (&lt;) definieren (dies ist der Standard-Operator z.B. beim Sortieren, Min- und Maxelement etc.).</p>
<p>Und du benötigst dafür eine sog. &quot;Strict Weak Ordering&quot;, d.h. du kannst nicht gleichzeitig nach x und y sortieren lassen, sondern höchstens z.B. erst nach x und dann (bei Gleichheit von x) nach y.</p>
<pre><code class="language-cpp">bool operator &lt;( const ClassXY *c1 ) const
{
    return this-&gt;xValue &lt; c1-&gt;xValue ||
           (this-&gt;xValue == c1-&gt;xValue &amp;&amp; this-&gt;yValue &lt; c1-&gt;yValue);
}
</code></pre>
<p>Wenn du aber jeweils den größten x und y Wert für deine grafische Anzeige benötigst, so solltest du dir mal die Funktion std::max_element aus &lt;algorithm&gt; anschauen (ich gehe mal davon aus, daß du irgendwo eine Liste (Vector) von den Objekten der 1. Klasse hast).</p>
<p>Du kannst dann einfach 2 (statische) Funktionen zum Vergleich der Funktion mitgeben:</p>
<pre><code class="language-cpp">bool ClassXY::LessX(const ClassXY &amp;xy1, const ClassXY &amp;xy2) // static in class-declaration
{
  return xy1.xValue &lt; xy2.xValue;
}

// same for LessY (but use yValue)

// in class Graph
std::vector&lt;ClassXY&gt; v;
int maxValueX = *max_element(v.begin(), v.end(), &amp;ClassXY&gt;::LessX); // use dereference
int maxValueY = *max_element(v.begin(), v.end(), &amp;ClassXY&gt;::LessY); // use dereference
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1427994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427994</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 11:38:32 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool operator &lt;( const ClassXY *c1 ) const
{
    return this-&gt;xValue &lt; c1-&gt;xValue ||
           (this-&gt;xValue == c1-&gt;xValue &amp;&amp; this-&gt;yValue &lt; c1-&gt;yValue);
}
</code></pre>
</blockquote>
<p>Wenn du den Vergleichsoperator so schreibst, muss er doch eine Methode und keine freie Funktion sein (oder halt zwei Parameter statt nur einem haben). Ok, könnte sein, dass der Code innerhalb der Klasse stehen soll <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>Außerdem würde man doch keinen Zeiger, sondern eine Referenz als Parameter nehmen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427997</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 11:53:02 GMT]]></title><description><![CDATA[<p>In der Tat ich verwende ein Onject std::list und da habe ich doch gleich mal noch ne Frage.<br />
Ich habe in der 2. Klasse auch einen std::list container der Objecte der 1. Klasse sammeln soll dazu habe ich hier auch ne Methode die die Elemente aufnehmen soll:</p>
<pre><code class="language-cpp">void m_AddNewGraph( const CGraph *cGraph ) {

    this-&gt;m_GraphContainer.push_back( &amp;cGraph );
}
</code></pre>
<p>der Container ist so definiert:<br />
std::list &lt; CGraph &gt; m_GraphContainer;</p>
<p>Will ich jetzt aber ein Objekt aufnehmen, das via new erstellt wurde bekomm ich nen Fehler. Kann mir wer sagen wo ran das liegt? Denn ich will ja nicht jedes mal wieder nen neues Objekt erstellen sondern nur die Pointer im container haben.</p>
<p>Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428004</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 11:57:09 GMT]]></title><description><![CDATA[<p>in deiner liste führst du &quot;ricthige&quot; objekte und keine zeiger. entweder du änderst deine list zu:<br />
std::list &lt; CGraph* &gt; m_GraphContainer;<br />
oder du erzeugst deine objekte nicht mit new, sondern einfach so.</p>
<p>ansonsten ist es immer hilfreich, wenn du auch schreibst, was in der fehlermeldung drinsteht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428005</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 12:36:06 GMT]]></title><description><![CDATA[<p>Phoemuex, du hast Recht - ich hatte nur den Code von TObi übernommen und den Inhalt angepaßt. Also hier noch mal richtig:</p>
<pre><code class="language-cpp">bool ClassXY::operator &lt;( const ClassXY &amp;c1 ) const
{
    return xValue &lt; c1.xValue ||
           (xValue == c1.xValue &amp;&amp; yValue &lt; c1.yValue);
}
</code></pre>
<p>Nun zu TObi:<br />
Wenn du nur Zeiger verwenden willst, dann muß deine Methode so aussehen:</p>
<pre><code class="language-cpp">void AddNewGraph( const CGraph *cGraph ) // kein m_ bei Methodennamen
{
    this-&gt;m_GraphContainer.push_back( cGraph );
}
</code></pre>
<p>Ich würde aber, sofern du keine Polymorphie bzw. sehr große Objekte verwendest, trotzdem einfach die Objekte selber im Container speichern.<br />
Ansonsten mußt du dich selber um die Speicherfreigabe kümmern oder aber alternativ z.B. Boost::shared_ptr&lt;&gt; einsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428014</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 30 Dec 2007 12:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Überladung von Vergleichsoperatoren einer Klasse. on Sun, 30 Dec 2007 13:06:24 GMT]]></title><description><![CDATA[<p>ok ich lass es dann einfach dabei, die Objekte ohne new zu erzeugen, so groß sind sie wirklich nicht.</p>
<p>danke euch,</p>
<p>Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428033</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Sun, 30 Dec 2007 13:06:24 GMT</pubDate></item></channel></rss>