<?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[Intelligente Pointer-Liste?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hatte bisher folgende Liste in einer Klasse &quot;Base&quot;:</p>
<pre><code class="language-cpp">class Base
{
 class BaseEntry {
  // ...
 };
 std::list&lt;BaseEntry*&gt; EntryPtrList;
 virtual void add_entry_to_list() = 0;
};
</code></pre>
<p>von der Oberklasse haben verschiedene Klassen abgeleitet, z.B. Inherited1:</p>
<pre><code class="language-cpp">class Inherited1 : public Base
{
 class InheritedEntry : public Base::BaseEntry {
  // ..
 };
 void add_entry_to_list() {
  EntryPtrList.push_back( new InheritedEntry );
 }
};
</code></pre>
<p>Das Problem ist ein wenig kompliziert. Da könnten jetzt Syntax-Error drin sein aber ich denke das Prinzip ist verständlich.</p>
<p>Der Nachteil ist, dass jede vererbte Klasse einen anderen Entry hat und von daher jedes mal die add_entry_to_lsit()-Funktion neu implementiert werden müsste (was schon ein bischen lästig wird...).</p>
<p>Ich würde dieses add gerne generell in die add-Funktion der Base-Klasse verlegen um diese Arbeit unnötig zu machen. Wie das geht weiß ich nicht, aber ich dachte mir, vllt könnte ich der Liste bei ihrer Initialisierung sagen, welche Pointer-Arten sie allokieren soll (Also, dass sie statt Base* einfach Inherited* allokiert). Jede Liste hat einen &quot;allocator type&quot; (meist das zweite Template), vllt ist es das? (Was heißt das überhaupt?)</p>
<p>Wäre es so auch möglich, dass ich statt einer list&lt;BaseEntry*&gt; eine list&lt;BaseEntry&gt; nehmen könnte? Denn die Liste allokiert ja sowieso schon Speicher für das einzufügende Element, und dass ich dann mit new nochmal allokiere ist ja &quot;doppelt gemoppelt&quot; oO - sprich ich will nicht den Pointer an die Liste hängen sondern die Entry-Klasse - aber immer noch virtuell.</p>
<p>Gruß,<br />
voipointer</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218333/intelligente-pointer-liste</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 06:29:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218333.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jul 2008 12:52:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Intelligente Pointer-Liste? on Sat, 19 Jul 2008 12:52:42 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hatte bisher folgende Liste in einer Klasse &quot;Base&quot;:</p>
<pre><code class="language-cpp">class Base
{
 class BaseEntry {
  // ...
 };
 std::list&lt;BaseEntry*&gt; EntryPtrList;
 virtual void add_entry_to_list() = 0;
};
</code></pre>
<p>von der Oberklasse haben verschiedene Klassen abgeleitet, z.B. Inherited1:</p>
<pre><code class="language-cpp">class Inherited1 : public Base
{
 class InheritedEntry : public Base::BaseEntry {
  // ..
 };
 void add_entry_to_list() {
  EntryPtrList.push_back( new InheritedEntry );
 }
};
</code></pre>
<p>Das Problem ist ein wenig kompliziert. Da könnten jetzt Syntax-Error drin sein aber ich denke das Prinzip ist verständlich.</p>
<p>Der Nachteil ist, dass jede vererbte Klasse einen anderen Entry hat und von daher jedes mal die add_entry_to_lsit()-Funktion neu implementiert werden müsste (was schon ein bischen lästig wird...).</p>
<p>Ich würde dieses add gerne generell in die add-Funktion der Base-Klasse verlegen um diese Arbeit unnötig zu machen. Wie das geht weiß ich nicht, aber ich dachte mir, vllt könnte ich der Liste bei ihrer Initialisierung sagen, welche Pointer-Arten sie allokieren soll (Also, dass sie statt Base* einfach Inherited* allokiert). Jede Liste hat einen &quot;allocator type&quot; (meist das zweite Template), vllt ist es das? (Was heißt das überhaupt?)</p>
<p>Wäre es so auch möglich, dass ich statt einer list&lt;BaseEntry*&gt; eine list&lt;BaseEntry&gt; nehmen könnte? Denn die Liste allokiert ja sowieso schon Speicher für das einzufügende Element, und dass ich dann mit new nochmal allokiere ist ja &quot;doppelt gemoppelt&quot; oO - sprich ich will nicht den Pointer an die Liste hängen sondern die Entry-Klasse - aber immer noch virtuell.</p>
<p>Gruß,<br />
voipointer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549770</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sat, 19 Jul 2008 12:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Intelligente Pointer-Liste? on Sat, 19 Jul 2008 14:12:48 GMT]]></title><description><![CDATA[<p>Was soll das werden? Warum fügt add_entry_to_list einfach irgend ein neues Element ein? Warum übergibst du das nicht als Parameter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549797</guid><dc:creator><![CDATA[bigme]]></dc:creator><pubDate>Sat, 19 Jul 2008 14:12:48 GMT</pubDate></item><item><title><![CDATA[Reply to Intelligente Pointer-Liste? on Sat, 19 Jul 2008 18:58:40 GMT]]></title><description><![CDATA[<p>So wie mein Vorposter schon geschrieben hat, ist es das Beste einfach die Methode</p>
<pre><code class="language-cpp">void add(Base *base)
{
  EntryPtrList.push_back( base );
}
</code></pre>
<p>zu verwenden.<br />
Du mußt zwar dann die Erstellung des Objektes außerhalb vornehmen, aber was ist, wenn du Konstruktoren mit Parametern verwenden willst - das könntest du mit deiner Version nicht machen (da du die Signatur der Methode add ja nicht beim Überschreiben ändern darfst).</p>
<p>Alternativ könntest du auch eine Template-Methode verwenden:</p>
<pre><code class="language-cpp">template &lt;typename TBase&gt;
void add()
{
  EntryPtrList.push_back( new TBase() );
}

// Aufruf dann mit:
base.add&lt;Inherited&gt;();
</code></pre>
<p>Und zu deinen ganzen Fragen:</p>
<p>- der Allokator ist für die interne Speicherbeschaffung zuständig, d.h. dieser hat nichts mit deinem Problem zu tun - ändere diesen also erstmal nicht!</p>
<p>- Und die Liste mußt du mit Pointern füllen, da sonst der virtuelle Zugriff (Polymorphie) nicht klappt, denn bei std::list&lt;BaseEntry&gt; hätte jedes Element nur sizeof(BaseEntry) als Größe. Da abgeleitete Klassen meistens noch zusätzliche Membervariablen besitzen (insbesondere, wenn Base pure virtual ist), könnte in der Liste nur der Basisanteil gespeichert werden.</p>
<p>Du mußt außerdem bedenken, daß du beim Löschen eines Elementes aus der Liste von Hand das Element wieder löschen mußt (mittels delete).<br />
Eine Alternative dazu sind die Shared-Pointer (z.B. boost::shared_ptr).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549909</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sat, 19 Jul 2008 18:58:40 GMT</pubDate></item></channel></rss>