<?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[Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern?]]></title><description><![CDATA[<p>Wie's im Titel steht, ich suche eine elegante Lösung für folgendes (Pseudocode-) Szenario:</p>
<pre><code class="language-cpp">struct foo : base;
struct bar : base;

int main()
{
  base* frob = new foo;
  transmogrify(frob);
  assert(dynamic_cast&lt;bar*&gt;(frob) != 0);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/183637/design-pattern-gesucht-klasse-eines-objekts-dynamisch-ändern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:34:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183637.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Jun 2007 22:11:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:49:51 GMT]]></title><description><![CDATA[<p>Wie's im Titel steht, ich suche eine elegante Lösung für folgendes (Pseudocode-) Szenario:</p>
<pre><code class="language-cpp">struct foo : base;
struct bar : base;

int main()
{
  base* frob = new foo;
  transmogrify(frob);
  assert(dynamic_cast&lt;bar*&gt;(frob) != 0);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1300399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300399</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:18:54 GMT]]></title><description><![CDATA[<p>N' Abend,</p>
<p>Also ich hätte spontan nur die Standard-Lösung auf die Du warscheinlich auch schon gekommen bist <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="🤡"
    /> .<br />
Von daher: Was stellst Du Dir denn unter einer &quot;elegante[n] Lösung&quot; vor <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="😉"
    /> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300404</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:18:54 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:21:11 GMT]]></title><description><![CDATA[<p>hola finix</p>
<p>kannst das mal bisschen genauer erklaeren was du da haben willst ? ich blick da nicht ganz durch</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300405</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:24:15 GMT]]></title><description><![CDATA[<p>finix ist einfach nur besoffen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300407</guid><dc:creator><![CDATA[lösung]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:31:40 GMT]]></title><description><![CDATA[<p>CodeFinder schrieb:</p>
<blockquote>
<p>N' Abend,</p>
<p>Also ich hätte spontan nur die Standard-Lösung auf die Du warscheinlich auch schon gekommen bist <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="🤡"
    /> .<br />
Von daher: Was stellst Du Dir denn unter einer &quot;elegante[n] Lösung&quot; vor <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="😉"
    /> ?</p>
</blockquote>
<p>Elegant wäre eine Lösung so nah wie möglich am Titel, die Klasse des Objekts dynamisch ändern <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>Die &quot;Identität&quot; des Objekts soll natürlich erhalten bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300408</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:46:29 GMT]]></title><description><![CDATA[<p>in deinem beispiel assert(dynamic_cast&lt;bar*&gt;(bar) != 0) das geht gar nicht... bar ist kein zeiger sondern eine klasse, also kann man (bar) nicht caste, weil es gar kein zeiger ist.</p>
<p>musst mal nochmal genauer ein beispiel geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300411</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 22:49:19 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>kannst das mal bisschen genauer erklaeren was du da haben willst ? ich blick da nicht ganz durch</p>
</blockquote>
<p>Im Prinzip genau was ich geschrieben habe.</p>
<p>Vielleicht mal ein ad-hoc Beispiel. Du hast einen Filemanager und liest ein Verzeichnis ein:</p>
<pre><code class="language-cpp">struct document_record
{
  // file path etc.
};
</code></pre>
<p>Jetzt gehst du die Liste mit <code>document_record*</code> s durch, und änderst jedes *.mpg etc. in</p>
<pre><code class="language-cpp">struct video_document : document_record
{
  // playtime&amp; stuff
};
</code></pre>
<p>Oder du nimmst das <code>video_document</code> (auch wenn's hier nicht viel Sinn macht) und transformierst es in ein</p>
<pre><code class="language-cpp">struct audio_document : document_record;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1300414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300414</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 06 Jun 2007 22:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 23:50:01 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>in deinem beispiel assert(dynamic_cast&lt;bar*&gt;(bar) != 0) das geht gar nicht... bar ist kein zeiger sondern eine klasse, also kann man (bar) nicht caste, weil es gar kein zeiger ist.</p>
</blockquote>
<p>Ah, danke, kleiner Typo, hab's geändert. <code>frob</code> soll natürlich geändert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300416</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 06 Jun 2007 23:50:01 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 23:05:34 GMT]]></title><description><![CDATA[<p>Das geht so natürlich nicht, jedenfalls nicht mit einem Design Pattern, höchstens mit einem wilden, fragwürdigen Hack über placement-new. Das dem am nächsten kommende Design-Pattern müsste State sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300424</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 06 Jun 2007 23:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Wed, 06 Jun 2007 23:22:40 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Das geht so natürlich nicht, jedenfalls nicht mit einem Design Pattern, höchstens mit einem wilden, fragwürdigen Hack über placement-new. Das dem am nächsten kommende Design-Pattern müsste State sein.</p>
</blockquote>
<p>Natürlich geht das so nicht, das ist mir klar. Ich wüsste auch nicht wie man das mittels placement-new hacken könnte, ohne wenigstens max(sizeof) irgendwo zu hinterlegen.</p>
<p>Deswegen suche ich ja nach einem Design-Pattern - wobei Design-Pattern hier für &quot;Design-Pattern&quot; steht, nicht &quot;Design-Pattern aus diesem GOF-Buch&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300429</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 06 Jun 2007 23:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Thu, 07 Jun 2007 06:11:30 GMT]]></title><description><![CDATA[<p>du kannst ja vielleicht sowas in der Art machen:</p>
<pre><code class="language-cpp">class document
{
    //...
};
class video_document:public document
{
    //...
};
class record
{
    private:
      document* document;
    public:
        setType(document* doc);
        document* getType();  
};
transmogrify(record* rec)
{
     rec-&gt;setType(new video_document);
}

int main()
{
     record* rec=new record;
     transmogrify(rec);
     assert(dynamic_cast&lt;video_document*&gt;(frob.getType()) != 0);  
}
</code></pre>
<p>muss man natürlich nicht so machen, worauf es ankommt ist halt, dass die arbeit von record an ein polymorphes document weitergeleitet wird. nach aussen hin ändert sich nichts, nach innen is alles möglich <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/1300467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300467</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 07 Jun 2007 06:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Thu, 07 Jun 2007 08:56:46 GMT]]></title><description><![CDATA[<p>re</p>
<p>vielleicht einen transmogrify_cast bauen ;o)</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
class IsDerived
{
   private:
      template&lt;class U&gt;
      class helper
      {
         public:
           typedef char small;
           typedef int big;

            static small Test(T);
            static big Test(...);
            static U* MakeT(void);
      };

      typedef helper&lt;U&gt; my_helper;

   public:
      enum { result = (sizeof(my_helper::Test(*my_helper::MakeT())) ==
                      sizeof(my_helper::small)) };

};

template&lt;class T, class U&gt;
int is_derived(const U &amp;param)
{
   return IsDerived&lt;T*,U&gt;::result;
}

template&lt;int b&gt;
class bool_type { };

template&lt;class T, class U&gt;
bool MakeNewType(U *&amp;u, typename bool_type&lt;0&gt; b)
{
   return false;
}

template&lt;class T, class U&gt;
bool MakeNewType(U *&amp;u, typename bool_type&lt;1&gt; b)
{
   U *t_u = new T(*u);
   delete u;
   u = t_u;
   return true;
}

template&lt;class T, class U&gt;
bool transmogrify_cast(U *&amp;u)
{
   return MakeNewType&lt;T&gt;(u, bool_type&lt;IsDerived&lt;T,U&gt;::result&gt;());
}

struct base
{
   base(void) { }
   base(const base &amp;b) { }
   virtual const char* ausgabe(void) const
   {
      static const char buf[] = &quot;bin ein base&quot;;
      return buf;
   }
};

struct foo : base
{
   foo(void) { }
   foo(const base &amp;b) : base(b) { }
   virtual const char* ausgabe(void) const
   {
      static const char buf[] = &quot;bin ein foo&quot;;
      return buf;
   }
};

struct bar : base
{
   bar(void) { }
   bar(const base &amp;b) : base(b) { }
   virtual const char* ausgabe(void) const
   {
      static const char buf[] = &quot;bin ein bar&quot;;
      return buf;
   }
};

TFMain *FMain;

__fastcall TFMain::TFMain(TComponent* Owner) : TForm(Owner)
{
   this-&gt;Color = static_cast&lt;TColor&gt;(0xD8D8D8);

   base *p = new foo;
   ShowMessage(p-&gt;ausgabe());
   transmogrify_cast&lt;bar&gt;(p);
   ShowMessage(p-&gt;ausgabe());
   delete p;
}
</code></pre>
<p>Ausgabe:<br />
bin ein foo<br />
bin ein bar</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300544</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Thu, 07 Jun 2007 08:56:46 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Thu, 07 Jun 2007 12:49:41 GMT]]></title><description><![CDATA[<p>es ist technisch nicht möglich einfach die klase eines objektes zu ändern</p>
<p>da du allerdings dynamisch in subklassen transformieren willst, kannst du evtl einfach das objekt austauschen</p>
<p>alternativ kannst du auch die metadata policy als membervariable der dateien machen, und dann kannst du je nach erkannten typ einfach das member setzen</p>
<pre><code class="language-cpp">pfad datei(&quot;C:\\test.txt&quot;);
datei.typinformationen = text_datei_infos(datei);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1300717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300717</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Thu, 07 Jun 2007 12:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Thu, 07 Jun 2007 13:41:23 GMT]]></title><description><![CDATA[<p>So ganz ist die GoF aber auch nicht aus dem Rennen</p>
<p>&quot;Brücke&quot; (&quot;Bridge&quot;) (liegt machen Vorschlägen zugrunde) und &quot;Zustand&quot; (&quot;State&quot;); zu letzterem schreiben Gamma et al.</p>
<p>&quot;Zweck:[...] Es wird so aussehen, als ob das Objekt seine Klasse gewechselt habe&quot;<br />
(4. korrigierter deutscher Nachdruck Addison-Wesley 1996 S.398)</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300753</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Thu, 07 Jun 2007 13:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Pattern gesucht: Klasse eines Objekts dynamisch ändern? on Thu, 07 Jun 2007 13:49:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4239">@finix</a>: Da das was du suchst so nicht möglich ist wäre es doch hilfreich zu wissen was genau du machen willst.<br />
Es gibt mehrere Möglichkeiten so etwas ähnliches zu machen, aber ohne genau zu wissen welche Eigenschaften du wirklich benötigst und welche nicht kann man wohl nur einen Schuss ins Blaue machen, und dafür ist mir irgendwie meine Zeit zu schade.</p>
<p>EDIT: die einfachste Variante wäre ein Zeiger auf einen Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300761</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jun 2007 13:49:03 GMT</pubDate></item></channel></rss>