<?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[konkrete Objekte abstrakter Klassen Clonen]]></title><description><![CDATA[<p>Hi Leute,<br />
am folgendem Problem tüftle ich momentan:<br />
Ich habe eine Klassenhierarchie, mit im Endeffekt, zwei &quot;Parteien&quot;,<br />
den &quot;Agenten&quot; die über ihre &quot;Umwelt&quot; etwas wissen und mit ihr Interagieren können,<br />
und den &quot;ControlAgenten&quot;, die &quot;Agenten&quot; kennen und diese &quot;Steuern&quot;.<br />
Unter Bestimmten Umständen muss der &quot;ControlAgent&quot; allerdings, einen seiner &quot;Agenten&quot;, Clonen ( z.B. aufgrund von Agenten mangel ;-).<br />
Und hier ist mein Problem, wie stell ich das an?<br />
Dadurch dass ich nur einen Zeiger auf eine abstrakte Klasse habe, fehlt mir ja die Information um welche konkrete Klasse es sich handelt.<br />
Zusätzlich kenne ich ja den spezifischen Konstruktor nicht...<br />
Nun suche ich hierzu eine elegante Möglichkeit das zu bewerkstelligen.</p>
<p>Meine Ideen waren folgende:</p>
<p>1. Der &quot;ControlAgent&quot; nimmt nicht einen konkreten &quot;Agenten&quot; auf, sondern nur ein &quot;FactoryObjekt&quot; , welches einen konkreten Agenten instanzieren kann.</p>
<p>2. Irgendwie den Speicher mit memcpy Kopieren( und danach seinen zustand mit ResetState() inizieren )</p>
<p>Aber am liebsten wäre mir doch wenn jeder Agent eine Funktion &quot;Create&quot; hätte, um eine neue Instanz seiner selbst zu erstellen(am besten genauso wie er selbst erstellt wurde).</p>
<pre><code class="language-cpp">class AbstractAgent
{
//....
public:
  virtual void ResetState()=0;
  virtual Message DoIt( Data const&amp; )=0;
};

class AbstractControlAgent : public AbstractAgent
{
std::vector&lt;AbstractAgent*&gt; Agents;
public:
  int/*ID*/ AddAgent( AbstractAgent*)//Fügt einen Agenten hinzu
//...
};

class ControlAgent1 : public AbstractControlAgent
{
public:
  virtual Message DoIt( Data const&amp; )
  {
    // Let Agents Do Sth.
  }
};

class Agent1 : public AbstractAgent
{
private:
   int Counter;
public:
  Agent1(int Counter): AbstractAgent(...), Counter(Counter) {}
  virtual void ResetState(){....}
  virtual Message DoIt( Data const&amp; );
};

class Agent2 : public AbstractSlave
{
private:
   std::string Text;
public:
  Agent2(std::string Text): AbstractAgent(...), Test(Test) {}
  virtual void ResetState(){....}
  virtual Message DoIt( Data const&amp; );
};
</code></pre>
<p>gruss<br />
AgentX</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282371/konkrete-objekte-abstrakter-klassen-clonen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 07:59:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282371.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Feb 2011 18:32:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 18:32:27 GMT]]></title><description><![CDATA[<p>Hi Leute,<br />
am folgendem Problem tüftle ich momentan:<br />
Ich habe eine Klassenhierarchie, mit im Endeffekt, zwei &quot;Parteien&quot;,<br />
den &quot;Agenten&quot; die über ihre &quot;Umwelt&quot; etwas wissen und mit ihr Interagieren können,<br />
und den &quot;ControlAgenten&quot;, die &quot;Agenten&quot; kennen und diese &quot;Steuern&quot;.<br />
Unter Bestimmten Umständen muss der &quot;ControlAgent&quot; allerdings, einen seiner &quot;Agenten&quot;, Clonen ( z.B. aufgrund von Agenten mangel ;-).<br />
Und hier ist mein Problem, wie stell ich das an?<br />
Dadurch dass ich nur einen Zeiger auf eine abstrakte Klasse habe, fehlt mir ja die Information um welche konkrete Klasse es sich handelt.<br />
Zusätzlich kenne ich ja den spezifischen Konstruktor nicht...<br />
Nun suche ich hierzu eine elegante Möglichkeit das zu bewerkstelligen.</p>
<p>Meine Ideen waren folgende:</p>
<p>1. Der &quot;ControlAgent&quot; nimmt nicht einen konkreten &quot;Agenten&quot; auf, sondern nur ein &quot;FactoryObjekt&quot; , welches einen konkreten Agenten instanzieren kann.</p>
<p>2. Irgendwie den Speicher mit memcpy Kopieren( und danach seinen zustand mit ResetState() inizieren )</p>
<p>Aber am liebsten wäre mir doch wenn jeder Agent eine Funktion &quot;Create&quot; hätte, um eine neue Instanz seiner selbst zu erstellen(am besten genauso wie er selbst erstellt wurde).</p>
<pre><code class="language-cpp">class AbstractAgent
{
//....
public:
  virtual void ResetState()=0;
  virtual Message DoIt( Data const&amp; )=0;
};

class AbstractControlAgent : public AbstractAgent
{
std::vector&lt;AbstractAgent*&gt; Agents;
public:
  int/*ID*/ AddAgent( AbstractAgent*)//Fügt einen Agenten hinzu
//...
};

class ControlAgent1 : public AbstractControlAgent
{
public:
  virtual Message DoIt( Data const&amp; )
  {
    // Let Agents Do Sth.
  }
};

class Agent1 : public AbstractAgent
{
private:
   int Counter;
public:
  Agent1(int Counter): AbstractAgent(...), Counter(Counter) {}
  virtual void ResetState(){....}
  virtual Message DoIt( Data const&amp; );
};

class Agent2 : public AbstractSlave
{
private:
   std::string Text;
public:
  Agent2(std::string Text): AbstractAgent(...), Test(Test) {}
  virtual void ResetState(){....}
  virtual Message DoIt( Data const&amp; );
};
</code></pre>
<p>gruss<br />
AgentX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022974</guid><dc:creator><![CDATA[AgentX]]></dc:creator><pubDate>Fri, 18 Feb 2011 18:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 18:33:49 GMT]]></title><description><![CDATA[<p>Naja, du sagst es doch schon, lass die Klassen sich selbst klonen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022975</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 18 Feb 2011 18:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:00:10 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Naja, du sagst es doch schon, lass die Klassen sich selbst klonen!</p>
</blockquote>
<p>Ja und hier weis ich nicht genau wie ich das machen könnte:<br />
- Füre ich nun eine virtuell/abstrakte methode ein, die dann in Jeder Konkreten Klasse definiert wird.<br />
- Oder kopiere ich einfach mit Memcpy den gesamten Speicher ( die größe des benötigten Speichers könnte man mit ner template klasse ermitteln und von dieser erben lassen (Currious recurring Patter?) )</p>
<p>Und was sollte der Rückgabewert dieser Funktion Sein?<br />
Die konkrete Klasse? ( und einen Kopierkonstruktor zu definieren? )<br />
Aber wie speichere ich dann dieses Objekt wenn das innerhalb einer Funktion geschieht und dieses auch danach bestehen soll.<br />
Ich meine wenn ich dieses Objekt in den Vector pusche und ich den Gültigkeitsbereich verlasse, wird da nicht das Objekt zerstört?</p>
<p>oder ein Zeiger auf die Basisklasse?</p>
<p>Oder Sollte ich beide Anbieten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022994</guid><dc:creator><![CDATA[AgentX]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:05:08 GMT]]></title><description><![CDATA[<p>Ersteres.<br />
Der Memcpy-Weg schlägt bei allen Fällen fehl, in denen die Objekte Referenzen oder Handles oder was auch immer auf etwas externes enthalten.</p>
<p>Ja, sagen wir, du hast folgendes:</p>
<pre><code class="language-cpp">class AgentBase {
public:
    virtual AgentBase* Clone() = 0;

};

class AgentA : public AgentBase
{
    AgentBase* Clone() {
        return new AgentA(*this);  // Oder wie auch immer du das kopieren des Zustands umsetzen magst
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2022996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022996</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:18:40 GMT]]></title><description><![CDATA[<p>Du darfst in der Implementiertung von Clone() sogar AgentA* als Rückgabetyp angeben (covariant return types).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023006</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:25:35 GMT]]></title><description><![CDATA[<p>Wie ist das eigentlich, wenn das Objekt im Vector ist, kümmert sich der vector eigentlich über die speicherfreigabe wenn dieser Zerstört wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023010</guid><dc:creator><![CDATA[AgentX]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:27:28 GMT]]></title><description><![CDATA[<p>AgentX schrieb:</p>
<blockquote>
<p>Wie ist das eigentlich, wenn das Objekt im Vector ist, kümmert sich der vector eigentlich über die speicherfreigabe wenn dieser Zerstört wird?</p>
</blockquote>
<p>Kommt darauf was Du unter &quot;wenn das Objekt im Vector ist&quot; verstehst.<br />
Wenn Du darunter verstehst, dass im Vector Pointer sind, welche auf ein mit new angelegtes Objekt zeigen - dann nicht.</p>
<p>Wenn tatsächlich Objekte im Vector sind, dann schon.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023012</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:27:59 GMT]]></title><description><![CDATA[<p>AgentX schrieb:</p>
<blockquote>
<p>Wie ist das eigentlich, wenn das Objekt im Vector ist, kümmert sich der vector eigentlich über die speicherfreigabe wenn dieser Zerstört wird?</p>
</blockquote>
<p>Ja, aber nur um die Objekte selber. Wenn die Objekte Zeiger sind, wird der Speicher dahinter nicht automatisch freigegeben. Deshalb sollte man auch vorsichtig sein mit besitzenden Zeigern in STL-Containern.</p>
<p>Eine Alternative ist die Bibliothek <em>Boost.PointerContainer</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023013</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:27:59 GMT</pubDate></item><item><title><![CDATA[Reply to konkrete Objekte abstrakter Klassen Clonen on Fri, 18 Feb 2011 19:48:53 GMT]]></title><description><![CDATA[<p>Oder ein container&lt;unique_ptr&lt;T&gt;&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023022</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 18 Feb 2011 19:48:53 GMT</pubDate></item></channel></rss>