<?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[[gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten]]></title><description><![CDATA[<p>Folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

enum types
{
    type_normal = 0,
    type_special = 1
};

class base
{
    public:
        virtual types getType() = 0;
        void mach_was()
        {
            std::cout &lt;&lt; &quot;Ich hab was gemacht...&quot;;
        }
};

class normal : public base
{
    private:
        int irgendwas;

    public:
        virtual types getType()
        {
            return type_normal;
        }
};

class special : public base
{
    private:
        int noch_was;

    public:
        virtual types getType()
        {
            return type_special;
        }
};

std::vector&lt;base *&gt; vPointers;
std::vector&lt;normal&gt; vNormal;
std::vector&lt;special&gt; vSpecial;

void add(base &amp;b)
{
    switch (b.getType())
    {
        case type_normal:
            vNormal.push_back(dynamic_cast&lt;normal &amp;&gt;(b));
            break;

        case type_special:
            vSpecial.push_back(dynamic_cast&lt;special &amp;&gt;(b));
            break;
    }

    vPointers.push_back(&amp;b);
}

int main()
{
    normal n;
    special s;

    add(n);
    add(s);

    std::vector&lt;base *&gt;::const_iterator it;

    for (it = vPointers.begin(); it != vPointers.end(); it++)
    {
        (*it)-&gt;mach_was();
    }

    std::cin.get();
}
</code></pre>
<p>Im Endeffekt geht es mir darum, Objekte der Klassen <em>normal</em> und <em>special</em> und die dazugehörigen Pointer irgendwo zu speichern. Die Pointer speichere ich in einer einzigen Liste, damit ich hinterher bequem drüber iterieren kann, um bestimmte Methoden aufzurufen, die alle von der Basisklasse geerbt haben (z. B. mach_was()).<br />
Jetz kommen aber immer neue Typen hinzu und ich will bei der add-Funktion net jedes mal getType() abfragen, um dann den entsprechenden Vektor für die Objekte rauszufinden. Mit Templates hab ichs schon probiert, aber des geht net an allen Stellen. Beispielsweise empfang ich manchmal Informationen über Objekte per Netzwerk und muss dann da auch entscheiden, in welchen Vektor ich sie abspeicher.</p>
<p>Hat jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267323/gelöst-verschiedene-objekte-mit-gleicher-basisklasse-verwalten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 14:26:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267323.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 May 2010 11:39:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 13:47:56 GMT]]></title><description><![CDATA[<p>Folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

enum types
{
    type_normal = 0,
    type_special = 1
};

class base
{
    public:
        virtual types getType() = 0;
        void mach_was()
        {
            std::cout &lt;&lt; &quot;Ich hab was gemacht...&quot;;
        }
};

class normal : public base
{
    private:
        int irgendwas;

    public:
        virtual types getType()
        {
            return type_normal;
        }
};

class special : public base
{
    private:
        int noch_was;

    public:
        virtual types getType()
        {
            return type_special;
        }
};

std::vector&lt;base *&gt; vPointers;
std::vector&lt;normal&gt; vNormal;
std::vector&lt;special&gt; vSpecial;

void add(base &amp;b)
{
    switch (b.getType())
    {
        case type_normal:
            vNormal.push_back(dynamic_cast&lt;normal &amp;&gt;(b));
            break;

        case type_special:
            vSpecial.push_back(dynamic_cast&lt;special &amp;&gt;(b));
            break;
    }

    vPointers.push_back(&amp;b);
}

int main()
{
    normal n;
    special s;

    add(n);
    add(s);

    std::vector&lt;base *&gt;::const_iterator it;

    for (it = vPointers.begin(); it != vPointers.end(); it++)
    {
        (*it)-&gt;mach_was();
    }

    std::cin.get();
}
</code></pre>
<p>Im Endeffekt geht es mir darum, Objekte der Klassen <em>normal</em> und <em>special</em> und die dazugehörigen Pointer irgendwo zu speichern. Die Pointer speichere ich in einer einzigen Liste, damit ich hinterher bequem drüber iterieren kann, um bestimmte Methoden aufzurufen, die alle von der Basisklasse geerbt haben (z. B. mach_was()).<br />
Jetz kommen aber immer neue Typen hinzu und ich will bei der add-Funktion net jedes mal getType() abfragen, um dann den entsprechenden Vektor für die Objekte rauszufinden. Mit Templates hab ichs schon probiert, aber des geht net an allen Stellen. Beispielsweise empfang ich manchmal Informationen über Objekte per Netzwerk und muss dann da auch entscheiden, in welchen Vektor ich sie abspeicher.</p>
<p>Hat jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901101</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sat, 22 May 2010 13:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:24:12 GMT]]></title><description><![CDATA[<p>Bei dem Design wirst du um so etwas nicht herum kommen.</p>
<p>Warum musst du denn die Zeiger auch noch in einem seperatem Container halten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901119</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 22 May 2010 12:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:30:01 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Bei dem Design wirst du um so etwas nicht herum kommen.</p>
</blockquote>
<p>Das klingt ja so wie &quot;bei der besch... Programmierung wundert mich gar nix mehr&quot; <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>drakon schrieb:</p>
<blockquote>
<p>Warum musst du denn die Zeiger auch noch in einem seperatem Container halten?</p>
</blockquote>
<p>Weil ich wie gesagt gerne über alle Objekte drüber iterieren möchte und dazu net jeden Vektor einzeln durchgehen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901121</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sat, 22 May 2010 12:30:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:34:31 GMT]]></title><description><![CDATA[<p>Max0r schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Bei dem Design wirst du um so etwas nicht herum kommen.</p>
</blockquote>
<p>Das klingt ja so wie &quot;bei der besch... Programmierung wundert mich gar nix mehr&quot; <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>
</blockquote>
<p>Wenn du wirklich diese Anforderungen hast, dann finde ich das gar keine so schlechte Lösung. Ich würde halt schauen, dass das doch einigermassen gut wartbar ist, damit du nicht viel Code ändern musst, aber ich denke nicht, dass da so viele neue unerwartete Klassen ständig dazu kommen.</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Warum musst du denn die Zeiger auch noch in einem seperatem Container halten?</p>
</blockquote>
<p>Weil ich wie gesagt gerne über alle Objekte drüber iterieren möchte und dazu net jeden Vektor einzeln durchgehen will.</p>
</blockquote>
<p>Nein nicht den, sondern die speziellen. Also vNormal und vSpecial. Üblicherweise schaut man dazu, dass die Sachen, die die machen halt polymorph geschehen können und dann wird dein seperates halten überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901122</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 22 May 2010 12:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:38:07 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Nein nicht den, sondern die speziellen. Also vNormal und vSpecial. Üblicherweise schaut man dazu, dass die Sachen, die die machen halt polymorph geschehen können und dann wird dein seperates halten überflüssig.</p>
</blockquote>
<p>Dazu müsste ich aber mit <em>new</em> arbeiten, das wollte ich verhindern. RAII finde ich da schöner.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901124</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sat, 22 May 2010 12:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:44:37 GMT]]></title><description><![CDATA[<p>Jetzt machst du aber ein durcheinander.<br />
Ich habe den Code vorhin nicht genau angeschaut, aber das geht so sowieso nicht.</p>
<p>Du speicherst da Kopien von den Instanzen in vNormal und vSpecial und Zeiger auf andere Objekte in vPointers.<br />
Das musst du so sowieso mit Zeiger machen, aber new brauchst du wegen dem troztdem nicht.</p>
<pre><code class="language-cpp">std::vector&lt;base *&gt; vPointers;
std::vector&lt;normal*&gt; vNormal;
std::vector&lt;special*&gt; vSpecial;

void add(base* b)
{
    switch (b.getType())
    {
        case type_normal:
            vNormal.push_back(dynamic_cast&lt;normal*&gt;(b));
            break;

        case type_special:
            vSpecial.push_back(dynamic_cast&lt;special*&gt;(b));
            break;
    }

    vPointers.push_back(b);
}

int main()
{
    normal n;
    special s;

    add(&amp;n);
    add(&amp;s);

    std::vector&lt;base *&gt;::const_iterator it;

    for (it = vPointers.begin(); it != vPointers.end(); it++)
    {
        (*it)-&gt;mach_was();
    }

    std::cin.get();
}
</code></pre>
<p>Das überprüfen des castest auf Erfolg (und sonst schmeissen einer Exception) wäre sicher etwas, was du noch verbessern kannst.<br />
Aber nochmal: Wozu brauchst du die speziellen Container?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901127</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 22 May 2010 12:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:51:40 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Jetzt machst du aber ein durcheinander.<br />
Ich habe den Code vorhin nicht genau angeschaut, aber das geht so sowieso nicht.</p>
<p>Du speicherst da Kopien von den Instanzen in vNormal und vSpecial und Zeiger auf andere Objekte in vPointers.<br />
Das musst du so sowieso mit Zeiger machen, aber new brauchst du wegen dem troztdem nicht.</p>
</blockquote>
<p>Upsala, in meinem eigentlichen Code speicher ich schon die richtige Adresse von der Kopie. Hab ich dem Beispiel vergessen/falsch gemacht, da hast du recht.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Das überprüfen des castest auf Erfolg (und sonst schmeissen einer Exception) wäre sicher etwas, was du noch verbessern kannst.</p>
</blockquote>
<p>Da stimm ich dir zu, aber das hab ich bewusst weggelassen, da es für mein Beispiel nicht relevant is.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Aber nochmal: Wozu brauchst du die speziellen Container?</p>
</blockquote>
<p>Um die Objekte bzw. deren Kopien zu speichern. Du speicherst jetzt die Adressen der lokalen Objekte aus main(). Das geht ja noch, weil main() bis zum Programmende nicht verlassen wird. Ich ruf add() aber nicht in main() auf, deswegen kann ich net die Adressen der jeweiligen lokalen Objekte nehmen (die sind ja nach Verlassen der Funktion nimmer gültig).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901133</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sat, 22 May 2010 12:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 12:59:09 GMT]]></title><description><![CDATA[<p>Pff. Nur wegen dem?</p>
<p>Du willst RAII? Da hast du RAII:<br />
<a href="http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/doc/ptr_container.html</a></p>
<p>Du kannst jetzt darauf beharren, dass du da die Objekte so erstellen willst und musst dich eben um das obige Problem kümmern, oder du machst es dir einfacher und benutzt einen solchen Pointer Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901139</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 22 May 2010 12:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschiedene Objekte mit gleicher Basisklasse verwalten on Sat, 22 May 2010 13:47:13 GMT]]></title><description><![CDATA[<p>Ja, &quot;nur&quot; deswegen. Den Link werd ich mir mal genauer anschauen, danke. Werd den Thread dann mal auf gelöst setzen, ich denk dass ich jetz die Informationen hab, die ich gebraucht hab <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/1901149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901149</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sat, 22 May 2010 13:47:13 GMT</pubDate></item></channel></rss>