<?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[std::list::push_back an Bedingung knüpfen]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte Instanzen meiner Klasse <code>MyClass</code> in einer Liste darstellen und verwende dazu das STL-Template <code>std::list&lt;MyClass&gt;</code> . Lässt sich nun die Memberfunktion <code>push_back()</code> irgendwie überschreiben und durch eigenen Code ersetzen? Zum Beispiel soll vor dem Einfügen überprüft werden, ob das für diesen Listentyp überhaupt zulässig ist. Ich habe mir auch gedacht, einen Wrapper zu schreiben, aber ich finde es Unfug, jede Memberfunktion in meinem Wrapper, an <code>std::list</code> weiterzuleiten. Gibt es denn keine elegantere Lösung?</p>
<p>Grüße,</p>
<p>daersc</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268664/std-list-push_back-an-bedingung-knüpfen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 14:51:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268664.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jun 2010 14:59:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 14:59:42 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte Instanzen meiner Klasse <code>MyClass</code> in einer Liste darstellen und verwende dazu das STL-Template <code>std::list&lt;MyClass&gt;</code> . Lässt sich nun die Memberfunktion <code>push_back()</code> irgendwie überschreiben und durch eigenen Code ersetzen? Zum Beispiel soll vor dem Einfügen überprüft werden, ob das für diesen Listentyp überhaupt zulässig ist. Ich habe mir auch gedacht, einen Wrapper zu schreiben, aber ich finde es Unfug, jede Memberfunktion in meinem Wrapper, an <code>std::list</code> weiterzuleiten. Gibt es denn keine elegantere Lösung?</p>
<p>Grüße,</p>
<p>daersc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911273</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 Jun 2010 14:59:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 15:05:44 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>Zum Beispiel soll vor dem Einfügen überprüft werden, ob das für diesen Listentyp überhaupt zulässig ist.</p>
</blockquote>
<p>Was meinst du damit?</p>
<blockquote>
<p>Ich habe mir auch gedacht, einen Wrapper zu schreiben, aber ich finde es Unfug, jede Memberfunktion in meinem Wrapper, an <code>std::list</code> weiterzuleiten. Gibt es denn keine elegantere Lösung?</p>
</blockquote>
<p>Du kannst von den STL-Containern erben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911278</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 12 Jun 2010 15:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 15:10:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du kannst von den STL-Containern erben.</p>
</blockquote>
<p>Kann man, würde ich aber nicht empfehlen! Denn die Destruktoren der Container aus der Standardbibliothek müssen nicht virtuell sein. Zudem ist es fraglich, ob hier eine Is-A Beziehung wirklich zutrifft.</p>
<p>Ich denke, dass ein Wrapper hier definitiv der beste Ansatz ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911280</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jun 2010 15:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 15:13:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>daersc schrieb:</p>
<blockquote>
<p>Zum Beispiel soll vor dem Einfügen überprüft werden, ob das für diesen Listentyp überhaupt zulässig ist.</p>
</blockquote>
<p>Was meinst du damit?</p>
</blockquote>
<p>Ach Kacke, was hab ich da für nen Müll geschrieben... Ich wollte überprüfen, ob irgendetwas dagegen spricht, das Element auch tatsächlich zur Liste hinzuzufügen. <code>MyClass</code> beinhaltet Zeiger auf zwei Objekte einer anderen Klasse. Es sollte pro Liste aber nur jeweils einmal auf das selbe Objekt verwiesen werden.</p>
<blockquote>
<blockquote>
<p>Ich habe mir auch gedacht, einen Wrapper zu schreiben, aber ich finde es Unfug, jede Memberfunktion in meinem Wrapper, an <code>std::list</code> weiterzuleiten. Gibt es denn keine elegantere Lösung?</p>
</blockquote>
<p>Du kannst von den STL-Containern erben.</p>
</blockquote>
<p>Kann ich dann auch den Cast zu den STL-Containern verhindern? Sonst könnte ja jemand casten und dann doch mit seinem <code>push_back()</code> tun und lassen, was er will...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911283</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 Jun 2010 15:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 15:24:10 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>Kann ich dann auch den Cast zu den STL-Containern verhindern? Sonst könnte ja jemand casten und dann doch mit seinem <code>push_back()</code> tun und lassen, was er will...</p>
</blockquote>
<p>Gegen böse Absicht kannst du dich ohnehin nicht wehren. Der Einsatz von Casts zeigt ja, dass sich der Programmierer (hoffentlich <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="🙂"
    /> ) bewusst ist, was er da tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911288</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 12 Jun 2010 15:24:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sat, 12 Jun 2010 16:43:39 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>Kann ich dann auch den Cast zu den STL-Containern verhindern? Sonst könnte ja jemand casten und dann doch mit seinem <code>push_back()</code> tun und lassen, was er will...</p>
</blockquote>
<p>Der Anlass, dies verhindern zu wollen, deutet stark darauf hin, dass Vererbung der falsche Ansatz ist. Nur aus Bequemlichkeit, um sich vor ein paar einzeiligen Weiterleitungsfunktionen zu drücken, sollte man nicht vererben! Wie schon von Dravere angedeutet, trifft die Is-A-Beziehung (und das Liskonvsche Substitutionsprinzip) hier nicht zu, was Aggregation als Gliederungsmechanismus nahelegt.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Der Einsatz von Casts zeigt ja, dass sich der Programmierer (hoffentlich <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="🙂"
    /> ) bewusst ist, was er da tut.</p>
</blockquote>
<p>Eine Derived-to-Base-Konvertierung benötigt keinen Cast. Wie bei allen impliziten Konvertierungen besteht die Gefahr, dass sie unbewusst passiert. Wenn dann die Semantik nicht der erwarteten entspricht, bekommt man schnell sehr mühsame Probleme.</p>
<p>Allerdings scheint mir eine freie Funktion die beste Idee zu sein.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void specific_push_back(std::list&lt;T&gt;&amp; list, const T&amp; element)
{
    ... // spezifische Aktionen
    list.push_back(element);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1911333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911333</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 12 Jun 2010 16:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sun, 13 Jun 2010 05:38:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Allerdings scheint mir eine freie Funktion die beste Idee zu sein.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void specific_push_back(std::list&lt;T&gt;&amp; list, const T&amp; element)
{
    ... // spezifische Aktionen
    list.push_back(element);
}
</code></pre>
</blockquote>
<p>Und dann kommt irgendein Dödel und verwendet <code>std::list::push_back()</code> ...<br />
Ich glaube der Wrapper ist doch die beste Alternative.</p>
<p>Danke:-)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911523</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 13 Jun 2010 05:38:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::push_back an Bedingung knüpfen on Sun, 13 Jun 2010 11:16:32 GMT]]></title><description><![CDATA[<p>Ich habe halt angenommen, dass</p>
<p>daersc schrieb:</p>
<blockquote>
<p>ich möchte Instanzen meiner Klasse <code>MyClass</code> in einer Liste darstellen und verwende dazu das STL-Template <code>std::list&lt;MyClass&gt;</code> .</p>
</blockquote>
<p>nicht überall über das Programm verstreut vorkommt, sondern vielleicht nur an einem oder wenigen Orten. Und dann wäre es den Aufwand nicht wert, alle Funktionen weiterzuleiten.</p>
<p>Aber natürlich ist ein Wrapper die sicherste Möglichkeit. Ich würde bei der Gelegenheit aber gerade das Interface verkleinern. Brauchst du Dinge wie <code>splice()</code> , <code>get_allocator()</code> oder <code>pop_front()</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911626</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Jun 2010 11:16:32 GMT</pubDate></item></channel></rss>