<?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[Factory in C++]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich brauche Polymorphimus zur Laufzeit, wo verschiedene Bildrepräsentationen vorliegen können, z.B. Rastergraphiken oder Vektorgraphiken.<br />
Zur Bildverarbeitung brauche ich nun aber nur ein paar wenige Funktionen, denen es egal ist, ob das zu bearbeitende Bild nun von einem BMP, einem JPEG, einer Vektorgraphik oder was auch immer abstammt.<br />
Gut, also packe ich diese paar allgemeinen Funktionen in ein Interface, nennen wir es IImage.</p>
<p>Im Programm kann ich mir nun auch neue Instanzen von einer konkreten Klasse machen lassen mit einer Factory Funktion, der ich einen enum Wert übergebe.</p>
<p>Also sowas in der Art:</p>
<pre><code>IImage* image=CreateImage(EBitmap);
</code></pre>
<p>Jetzt kommt es bei manchen der Bildverarbeitungsalgorithmen vor, dass ich eine Kopie des Bildes brauche.<br />
Das ganze läuft so nach dem Prinzip</p>
<pre><code>void doSomething(IIMage* img)
</code></pre>
<p>, das heißt ich übergebe das Bild und dieses wird bearbeitet, es wird also nicht ein neues Bild zurückgegeben, sondern das übergebene Bild wird bearbeitet und ist nach dem Funktionsaufruf geändert.<br />
Zum Beispiel möchte ich das Bild um den Faktor 2 vergrößern. Dazu brauche ich ein neues doppelt so großes Bild, in welches ich dann reinzeichne. Bin ich mit dem zeichnen fertig, so swappe ich altes und neues Bild.</p>
<p>So, nun zu meinem Problem: Wie löst man das kopieren im Algorithmus einigermaßen elegant?</p>
<pre><code>IIMage* newImg=CreateImage(img-&gt;GetType()); 
doSomeThingWithNewImg(newImg,img); 
swap(img,NewImg); 
delete newImg;
</code></pre>
<p>Ziemlich viel new/delete im Code, nicht schön. Aber mit Templates bekomm ich wiederum keinen Laufzeitpolymorphimus bzw. Factoy Funktionen zusammen.<br />
Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313688/factory-in-c</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 03:54:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313688.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Feb 2013 18:47:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 18:47:53 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich brauche Polymorphimus zur Laufzeit, wo verschiedene Bildrepräsentationen vorliegen können, z.B. Rastergraphiken oder Vektorgraphiken.<br />
Zur Bildverarbeitung brauche ich nun aber nur ein paar wenige Funktionen, denen es egal ist, ob das zu bearbeitende Bild nun von einem BMP, einem JPEG, einer Vektorgraphik oder was auch immer abstammt.<br />
Gut, also packe ich diese paar allgemeinen Funktionen in ein Interface, nennen wir es IImage.</p>
<p>Im Programm kann ich mir nun auch neue Instanzen von einer konkreten Klasse machen lassen mit einer Factory Funktion, der ich einen enum Wert übergebe.</p>
<p>Also sowas in der Art:</p>
<pre><code>IImage* image=CreateImage(EBitmap);
</code></pre>
<p>Jetzt kommt es bei manchen der Bildverarbeitungsalgorithmen vor, dass ich eine Kopie des Bildes brauche.<br />
Das ganze läuft so nach dem Prinzip</p>
<pre><code>void doSomething(IIMage* img)
</code></pre>
<p>, das heißt ich übergebe das Bild und dieses wird bearbeitet, es wird also nicht ein neues Bild zurückgegeben, sondern das übergebene Bild wird bearbeitet und ist nach dem Funktionsaufruf geändert.<br />
Zum Beispiel möchte ich das Bild um den Faktor 2 vergrößern. Dazu brauche ich ein neues doppelt so großes Bild, in welches ich dann reinzeichne. Bin ich mit dem zeichnen fertig, so swappe ich altes und neues Bild.</p>
<p>So, nun zu meinem Problem: Wie löst man das kopieren im Algorithmus einigermaßen elegant?</p>
<pre><code>IIMage* newImg=CreateImage(img-&gt;GetType()); 
doSomeThingWithNewImg(newImg,img); 
swap(img,NewImg); 
delete newImg;
</code></pre>
<p>Ziemlich viel new/delete im Code, nicht schön. Aber mit Templates bekomm ich wiederum keinen Laufzeitpolymorphimus bzw. Factoy Funktionen zusammen.<br />
Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296896</guid><dc:creator><![CDATA[fdsfsdf]]></dc:creator><pubDate>Thu, 07 Feb 2013 18:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 18:54:29 GMT]]></title><description><![CDATA[<pre><code>class Image{
   private:
      IImage* rep;
   ...
   Image(Image const&amp; theOther){
      rep=theOther-&gt;rep-&gt;clone();//clone ist dort virtual
   }
   ~Iamge(){
      delete rep;//~IImage pur virtuell
   }
   int getWidth() const{
      return rep-&gt;getWidth();
   }
</code></pre>
<p>und nur noch Image anfassen. Meistens Image&amp; oder Image const&amp;.</p>
<p>Also im Prinzip ein Smart-Pointer mit ein wenig Image-Zucker.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296897</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 07 Feb 2013 18:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 18:58:33 GMT]]></title><description><![CDATA[<p>dankeschön <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/2296901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296901</guid><dc:creator><![CDATA[fdsfsdf]]></dc:creator><pubDate>Thu, 07 Feb 2013 18:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 19:03:28 GMT]]></title><description><![CDATA[<p>Noch was...wie bekomm ich jetzt da von der Factory Funktion was in die Image Klasse rein?</p>
<p>Die Factory liefert ja nur Pointer: IIMage* CreateImage(EImageType type);<br />
Oder soll ich die Factory mit der Image Klasse verschmelzen, also Image::Image(EImageType type) machen, dann bekomm ich nie einen IImage Pointer zu sehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296907</guid><dc:creator><![CDATA[fdsfsdf]]></dc:creator><pubDate>Thu, 07 Feb 2013 19:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 19:04:01 GMT]]></title><description><![CDATA[<p>fdsfsdf schrieb:</p>
<blockquote>
<p>Noch was...wie bekomm ich jetzt da von der Factory Funktion was in die Image Klasse rein?</p>
<p>Die Factory liefert ja nur Pointer: IIMage* CreateImage(EImageType type);<br />
Oder soll ich die Factory mit der Image Klasse verschmelzen, also Image::Image(EImageType type) machen, dann bekomm ich nie einen IImage Pointer zu sehen.</p>
</blockquote>
<p>Na, klar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296909</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 07 Feb 2013 19:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Thu, 07 Feb 2013 19:07:39 GMT]]></title><description><![CDATA[<p>gut dass das geklärt ist, dann kann ich ja jetzt weiterprogrammieren.<br />
danke nochmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296911</guid><dc:creator><![CDATA[fdsfsdf]]></dc:creator><pubDate>Thu, 07 Feb 2013 19:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Factory in C++ on Sat, 09 Feb 2013 10:05:44 GMT]]></title><description><![CDATA[<p>fdsfsdf schrieb:</p>
<blockquote>
<p>void doSomething(IIMage* img)<br />
Pointer: IIMage*<br />
IImage Pointer</p>
</blockquote>
<p>Deine &quot;i&quot;-Taste klemmt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2297358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2297358</guid><dc:creator><![CDATA[Kotnascher]]></dc:creator><pubDate>Sat, 09 Feb 2013 10:05:44 GMT</pubDate></item></channel></rss>