<?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[operator&amp;lt; überladen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte den operator&lt; für eine Klasse überladen, um die später in einem vector gespeicherten Objekte mittels std::sort sortieren zu können.</p>
<p>Seien also z.B. dies meine Objekte:</p>
<pre><code class="language-cpp">CMyObject* pMyObj1 = new CMyObject(/*...*/);
CMyObject* pMyObj2 = new CMyObject(/*...*/);
//etc.
</code></pre>
<p>und dies mein überladener Operator:</p>
<pre><code class="language-cpp">CMyObject::operator&lt;(const CMyObject&amp;) const
{
    if(/*...*/)
        return true;
    else
        return false;
}
</code></pre>
<p>Dann funktioniert folgender Aufruf wunderbar:</p>
<pre><code class="language-cpp">bool temp = *pMyObj1 &lt; *pMyObj2;
</code></pre>
<p>Allerdings hatte ich eigentlich vor, meine Objekte im Container als CMyObject* abzulegen, was dazu führen würde, dass mein überladener Operator leider nicht mehr so ohne weiteres funktioniert. Ein paar Fragen hätte ich deshalb:</p>
<p>1. Ist es sinnvoll die Objekte (deshalb) &quot;dereferenziert&quot; im Container abzulegen (also z.B. als *pMyObj1)?</p>
<p>2. Oder sollte ich mir eher eine Vergleichsfunktion (bzw. Funktor) bauen und die überladene Variante von std::sort verwenden?</p>
<p>3. Oder kann ich es irgendwie bewerkstelligen, dass ich den operator&lt; so überlade, dass er im Fall von pMyObj1 &lt; pMyObj2 funktioniert?</p>
<p>Welche dieser Vrianten ist also vorzuziehen (falls sich das überhaupt so pauschal sagen lässt)?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173389/operator-lt-überladen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 07:40:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173389.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Feb 2007 17:14:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator&amp;lt; überladen on Wed, 14 Feb 2007 17:14:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte den operator&lt; für eine Klasse überladen, um die später in einem vector gespeicherten Objekte mittels std::sort sortieren zu können.</p>
<p>Seien also z.B. dies meine Objekte:</p>
<pre><code class="language-cpp">CMyObject* pMyObj1 = new CMyObject(/*...*/);
CMyObject* pMyObj2 = new CMyObject(/*...*/);
//etc.
</code></pre>
<p>und dies mein überladener Operator:</p>
<pre><code class="language-cpp">CMyObject::operator&lt;(const CMyObject&amp;) const
{
    if(/*...*/)
        return true;
    else
        return false;
}
</code></pre>
<p>Dann funktioniert folgender Aufruf wunderbar:</p>
<pre><code class="language-cpp">bool temp = *pMyObj1 &lt; *pMyObj2;
</code></pre>
<p>Allerdings hatte ich eigentlich vor, meine Objekte im Container als CMyObject* abzulegen, was dazu führen würde, dass mein überladener Operator leider nicht mehr so ohne weiteres funktioniert. Ein paar Fragen hätte ich deshalb:</p>
<p>1. Ist es sinnvoll die Objekte (deshalb) &quot;dereferenziert&quot; im Container abzulegen (also z.B. als *pMyObj1)?</p>
<p>2. Oder sollte ich mir eher eine Vergleichsfunktion (bzw. Funktor) bauen und die überladene Variante von std::sort verwenden?</p>
<p>3. Oder kann ich es irgendwie bewerkstelligen, dass ich den operator&lt; so überlade, dass er im Fall von pMyObj1 &lt; pMyObj2 funktioniert?</p>
<p>Welche dieser Vrianten ist also vorzuziehen (falls sich das überhaupt so pauschal sagen lässt)?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1228954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1228954</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Wed, 14 Feb 2007 17:14:48 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Wed, 14 Feb 2007 17:24:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Warum willst du deine Objekte eigentlich als Pointer in den vector packen? Wenn das notwendig ist, würde ich Variante2 nehmen. Du könntest zwar auch einen operator&lt; für Pointer auf CMyObject erzeugen (global), das verändert aber das Standardverhalten von Pointervergleichen. Ich würde das nicht tun.<br />
Desweiteren würde ich an deinen Stelle den operator&lt; lieber außerhalb der Klasse (global) definieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1228961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1228961</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 14 Feb 2007 17:24:54 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Wed, 14 Feb 2007 18:02:11 GMT]]></title><description><![CDATA[<p>Zunächst mal danke für die schnelle Antwort!</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Warum willst du deine Objekte eigentlich als Pointer in den vector packen?</p>
</blockquote>
<p>Wenn ich ehrlich bin, weiß ich das eigentlich selbst nicht so genau <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />. Obwohl das in diesem Fall kein Thema ist, hatte ich da so Sachen wie Polymorphismus im Hinterkopf und dachte das sei deshalb vielleicht (ganz allgemein) die &quot;elegantere&quot; Variante <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=":confused:"
      alt="😕"
    /> Oder ist das völliger Quatsch?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Du könntest zwar auch einen operator&lt; für Pointer auf CMyObject erzeugen (global), das verändert aber das Standardverhalten von Pointervergleichen.</p>
</blockquote>
<p>Ok, das klingt logisch und überzeugt mich. Die Variante ist damit aus dem Rennen.<br />
Eine Rückfrage hätte ich dazu trotzdem: Für pointer auf CMyObject kann ich den Operator nur global überladen, richtig? Ich glaube, das war der Grund, warum ich nicht wusste wie man das anstellt, weil ich nur daran gedacht habe das in einer Elementfunktion der Klasse zu machen.</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Desweiteren würde ich an deinen Stelle den operator&lt; lieber außerhalb der Klasse (global) definieren).</p>
</blockquote>
<p>Gibt es dafür einen Grund, ist das für sämtliche Operatoren üblich? Was spricht dagegen das innerhalb der Klasse zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1228991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1228991</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Wed, 14 Feb 2007 18:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Wed, 14 Feb 2007 18:51:07 GMT]]></title><description><![CDATA[<p>Man definiert die Vergleichoperatoren (sowie +, - *, /) lieber global, um evtl. existierenden Konvertierungsoperatoren einfach nutzen zu können. Wenn du z.Bsp. eine Klasse MyDoub hast, die einen Konvertierungsoperator auf double besitzt, kannst du mit einem Vergleichsoperator allen Vergleichsarten erschlagen.<br />
z.Bsp.</p>
<pre><code class="language-cpp">MyDoub ma, mb;
double da, db;
// sind dann irgendwie gefüllt
// Dann ist folgendes mit einem globalen operator&lt; möglich
if( ma &lt; mb )
if( ma &lt; da )
if( db &lt; mb ) //etc.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1229014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1229014</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 14 Feb 2007 18:51:07 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Wed, 14 Feb 2007 22:37:01 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>1. Ist es sinnvoll die Objekte (deshalb) &quot;dereferenziert&quot; im Container abzulegen (also z.B. als *pMyObj1)?</p>
</blockquote>
<p>Nur zum Sortieren ganz sicher nicht. Wenn es aus anderen Gründen Sinn macht, wieso nicht, aber sicht nicht bloss damit du std::sort verwenden kannst.</p>
<blockquote>
<p>2. Oder sollte ich mir eher eine Vergleichsfunktion (bzw. Funktor) bauen und die überladene Variante von std::sort verwenden?</p>
</blockquote>
<p>Jupp. Würde ich so machen.</p>
<blockquote>
<p>3. Oder kann ich es irgendwie bewerkstelligen, dass ich den operator&lt; so überlade, dass er im Fall von pMyObj1 &lt; pMyObj2 funktioniert?</p>
</blockquote>
<p>Wäre mir nicht bekannt wie das gehen sollte. Du könntest höchstens std::less spezialisieren, aber das würde ich auf keinen Fall tun. Pfui Spinne.</p>
<blockquote>
<p>Welche dieser Vrianten ist also vorzuziehen (falls sich das überhaupt so pauschal sagen lässt)?</p>
<p>Danke im Voraus!</p>
</blockquote>
<p>Ich würde auf jeden Fall Version 2 vorschlagen.</p>
<p>Ob du zusätzlich noch Vergleichsoperatoeren anbieten solltest hängt davon ab was das für Klassen sind. Ich implementiere Vergleichsoperatoeren auf jeden Fall nur dann wenn sie Sinn machen (d.h. auch gut gebraucht werden können), wenn klar ist was verglichen wird, und wenn sie &quot;strict ordering&quot; implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1229129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1229129</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Feb 2007 22:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Thu, 15 Feb 2007 07:21:32 GMT]]></title><description><![CDATA[<p>Erstens: den op&lt; für einen reinen Pointer-Vergleich <strong>darfst</strong> du gar nicht überladen (wie Braunstein sagte, würde das mit dem Standardvergleich kollidieren und ist deshalb verboten).</p>
<p>Zweitens: Den op&lt; für Objekt-Vergleich kannst du wahlweise als Member oder als globale Funktion definieren - letzteres hat den Vorteil, daß der linke Operand auch etwas nach CMyObject konvertierbares sein darf. Wenn er Sinn macht, würde ich das tun (und die Vergleichs-Funktion dann als <code>bool compare(T* left,T* right){return *left&lt;*right;}</code> darauf aufbauen).</p>
<p>Drittens:</p>
<p>Nanuq schrieb:</p>
<blockquote>
<pre><code class="language-cpp">CMyObject::operator&lt;(const CMyObject&amp;) const
{
    if(/*.. Bedingung ..*/)
        return true;
    else
        return false;
}
</code></pre>
</blockquote>
<p>Warum so umständlich? Statt die Vergleichsbedingung auszuwerten, kannst du ihr Ergebnis auch direkt ausgeben:</p>
<pre><code class="language-cpp">bool operator&lt;(const CMyObject&amp; left,const CMyObject&amp; right)
{
  return /*.. Bedingung ..*/;
}
</code></pre>
<p>Viertens: Pointer zu speichern kann durchaus Sinn machen (Polymorphismus, Aufwand für Objekt-Kopie, Mehrfachnutzung von Objekten,...) - aber du solltest dir klar sein, daß du dann selber dafür verantwortlich bist, den Speicher zu verwalten. (an der Stelle wären vector&lt;boost::shared_ptr&lt;T&gt; &gt; oder Boost's Pointer-Container eine gute Alternative)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1229177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1229177</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Feb 2007 07:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; überladen on Fri, 16 Feb 2007 16:26:18 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten, ihr habt mir weitergeholfen!!!</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Erstens: den op&lt; für einen reinen Pointer-Vergleich darfst du gar nicht überladen (wie Braunstein sagte, würde das mit dem Standardvergleich kollidieren und ist deshalb verboten).</p>
</blockquote>
<p>Das leuchtet mir inzwischen volkommen ein, war ein wertvoller Hinweis!</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Warum so umständlich? Statt die Vergleichsbedingung auszuwerten, kannst du ihr Ergebnis auch direkt ausgeben</p>
</blockquote>
<p>Im tasächlichen Fall werden mehrere Kriterien überprüft. Ich habe deshalb ein paar verschachtelte if/else-Blöcke von denen bei der Zusammenfassung für dieses Posting dann irgendwie nur noch dieser Codeschnipsel übriggeblieben ist...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Viertens: Pointer zu speichern kann durchaus Sinn machen (Polymorphismus, Aufwand für Objekt-Kopie, Mehrfachnutzung von Objekten,...) - aber du solltest dir klar sein, daß du dann selber dafür verantwortlich bist, den Speicher zu verwalten. (an der Stelle wären vector&lt;boost::shared_ptr&lt;T&gt; &gt; oder Boost's Pointer-Container eine gute Alternative)</p>
</blockquote>
<p>Dann war ja mein erster Gedanke gar nicht so verkehrt</p>
<p>Nanuq schrieb:</p>
<blockquote>
<p>Polymorphismus</p>
</blockquote>
<p>:p *freu* :p<br />
Dass ich mich um die Speicherverwaltung dann selbst kümmern muss, ist mir klar, ob ich mich deswegen einmal etwas eingehender mit boost befasse noch nicht so ganz <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="😉"
    /><br />
Aber danke für den Hinweis.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>2. Oder sollte ich mir eher eine Vergleichsfunktion (bzw. Funktor) bauen und die überladene Variante von std::sort verwenden?</p>
</blockquote>
<p>Jupp. Würde ich so machen.</p>
</blockquote>
<p>Ich denke, darauf wird es hinauslaufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1229655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1229655</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Fri, 16 Feb 2007 16:26:18 GMT</pubDate></item></channel></rss>