<?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 für Template-Objekte]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich hab ne Klasse:</p>
<pre><code class="language-cpp">template&lt;typename TVoxel&gt;
class Image3d
{
  public:
    // create empty image
    Image3d(int nWidth, int nHeight, int nDepth);

    // load image from disk
    Image3d(std::string&amp; sFilePath);

    // return voxel at position
    TVoxel&amp; Voxel(int nX, int nY, int nZ);

  private:
    std::vector&lt;TVoxel&gt; m_aData;  

    [...]
};

typedef Image3d&lt;__uint8_t&gt; TImageGrey8;
typedef Image3d&lt;__uint16_t&gt; TImageGrey16;
</code></pre>
<p>Nun, das funktioniert zwar iss aber etwas unflexibel da ich, bevor ich das Bild mit dem 2. Konstruktor von Platte laden will, wissen muss welchen Voxeltyp es hat.<br />
Da der Voxeltyp aber in den Metadaten des Bildes Codiert ist, ließe sich das auch eleganter (automatisch machen). Ich hab da an eine Factory gedacht, die das entsprechende Bild erzeugt, nachdem sie den Pixeltyp bestimmt hat.</p>
<p>Mir ist aber nicht klar wie ich diese Implementieren soll, ich kann ja keinen Basisklassenpointer liefern da Image3d keine Basisklasse hat, wenn ich ein<br />
<em>IImage3d</em> interface implementiere, muss ich in der pur-virtuellen Methode <em>Voxel(int,int,int)</em> den Rückgabewert wissen.</p>
<p>Fällt jemand eine elegante Möglichkeit ein das zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149767/factory-für-template-objekte</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 08:33:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149767.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Jun 2006 07:43:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Factory für Template-Objekte on Fri, 09 Jun 2006 07:43:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich hab ne Klasse:</p>
<pre><code class="language-cpp">template&lt;typename TVoxel&gt;
class Image3d
{
  public:
    // create empty image
    Image3d(int nWidth, int nHeight, int nDepth);

    // load image from disk
    Image3d(std::string&amp; sFilePath);

    // return voxel at position
    TVoxel&amp; Voxel(int nX, int nY, int nZ);

  private:
    std::vector&lt;TVoxel&gt; m_aData;  

    [...]
};

typedef Image3d&lt;__uint8_t&gt; TImageGrey8;
typedef Image3d&lt;__uint16_t&gt; TImageGrey16;
</code></pre>
<p>Nun, das funktioniert zwar iss aber etwas unflexibel da ich, bevor ich das Bild mit dem 2. Konstruktor von Platte laden will, wissen muss welchen Voxeltyp es hat.<br />
Da der Voxeltyp aber in den Metadaten des Bildes Codiert ist, ließe sich das auch eleganter (automatisch machen). Ich hab da an eine Factory gedacht, die das entsprechende Bild erzeugt, nachdem sie den Pixeltyp bestimmt hat.</p>
<p>Mir ist aber nicht klar wie ich diese Implementieren soll, ich kann ja keinen Basisklassenpointer liefern da Image3d keine Basisklasse hat, wenn ich ein<br />
<em>IImage3d</em> interface implementiere, muss ich in der pur-virtuellen Methode <em>Voxel(int,int,int)</em> den Rückgabewert wissen.</p>
<p>Fällt jemand eine elegante Möglichkeit ein das zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074335</guid><dc:creator><![CDATA[__HIRSCH_H__]]></dc:creator><pubDate>Fri, 09 Jun 2006 07:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Factory für Template-Objekte on Fri, 09 Jun 2006 08:11:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>die <a href="http://loki-lib.sourceforge.net/" rel="nofollow">Loki - Library</a> bietet hierfür eine sehr gute Factory Klasse an.</p>
<p>Der Grundgedanke ist, den einzelnen Klassen eine Nummer zuzuweisen und diese mit einem Funktor auf die Erzeugermethode in einer std::map abzulegen.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074349</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 09 Jun 2006 08:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Factory für Template-Objekte on Fri, 09 Jun 2006 09:17:49 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>die <a href="http://loki-lib.sourceforge.net/" rel="nofollow">Loki - Library</a> bietet hierfür eine sehr gute Factory Klasse an.</p>
<p>Der Grundgedanke ist, den einzelnen Klassen eine Nummer zuzuweisen und diese mit einem Funktor auf die Erzeugermethode in einer std::map abzulegen.</p>
<p>MfG</p>
<p>GPC</p>
</blockquote>
<p>Ja, an Loki hatte ich auch schon gedacht, das Problem ist aber, dass ich nicht entscheiden will welcher Konstruktor aufgerufen werden soll, sondern die erzeugten Objekte unterschiedlich, bezüglich ihres Template-Parameters sind.<br />
So kann ich keine polymorphen Pointer zurückliefern.</p>
<p>Ich hab mir mal den (nicht gerade trivialen) Beispielcode angesehen und bin auf keine Möglichkeit gekommen mein Problem damit zu lösen. Gib mir mal 'nen Tip.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074388</guid><dc:creator><![CDATA[__HIRSCH_H__]]></dc:creator><pubDate>Fri, 09 Jun 2006 09:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Factory für Template-Objekte on Fri, 09 Jun 2006 09:56:53 GMT]]></title><description><![CDATA[<p>Ach so, ich denke, ich verstehe. Du hast Image – Objekte und diese haben verschiedene Template – Parameter, korrekt?</p>
<p>Aufgrund dieser willst du sie dann beim Einlesen unterscheiden? Ok, folgendes:</p>
<p>Du erstellst eine Objektfabrik (oder einzelne Factory-Methoden) für alle Kombinationen von Image&lt;T&gt;. Dann nimmst du eine std::map und fügst jeweils eine eindeutige Zahl zusammen mit einem Zeiger auf ein Factory-Methode ein, also die Zahl 0 weist auf ein Image&lt;A&gt; hin, 1 wird zu Image&lt;B&gt; gemappt usw.</p>
<p>Beim Schreiben deiner Images auf die Platte musst du diesen Wert natürlich auch abspeichern (am Besten du erstellst ein const int ID = 0; usw. Member für jeden Template-Parameter von Image, dann brauchst du dich nicht so verkopfen).</p>
<p>Und beim Einlesen gleichst du die Zahl einfach mit der std::map ab um zu sehen, welches Image&lt;T&gt; geladen wird. Okay?</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074431</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 09 Jun 2006 09:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Factory für Template-Objekte on Fri, 09 Jun 2006 10:46:40 GMT]]></title><description><![CDATA[<p>Templates gibts halt nur zur Compiletime danach hast du nur noch Klassen und die haben ohne Vererbung keine Beziehung zueinander, folglich kannst du die auch nicht gleich behandeln.</p>
<p>Mein Vorschlag: Gib den Image-Klassen eine gemeinsame Basisklasse Image, wenn das nicht geht, dann kannst du die beiden Klassen nicht gleich behandeln und musst zwischen ihnen unterscheiden, so wie du auch zwischen einer std::map und std::ofstream unterscheiden musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1074475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1074475</guid><dc:creator><![CDATA[Dr. Prof]]></dc:creator><pubDate>Fri, 09 Jun 2006 10:46:40 GMT</pubDate></item></channel></rss>