<?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[static und abgeleitete Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche sowas hier (was ja logischerweise nicht geht)</p>
<pre><code class="language-cpp">class IData
{
	...
};

class IFactory
{
public:
	static IData* CreateData() = 0;
};

class AData : public IData
{
	...
};

class AFactory : public IFactory
{
public:
	static IData* CreateData()
	{
		return new AData();
	}
};
</code></pre>
<p>Später möchte ich nur IFactory::CreateData() aufrufen, um das spezifische Data-Objekt zu bekommen.</p>
<p>Ich dachte man könnte das über Templates lösen, was aber im Nachhinein Quatsch ist <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="😉"
    /> weil man dort auch den richtigen Klassennamen angeben muss.</p>
<pre><code class="language-cpp">template &lt;class Derived&gt;
class IFactory
{
public:
	static IData* CreateData() { return Derived::CreateData(); }
};

class AFactory : public IFactory&lt;AFactory&gt;
{
public:
	static IData* CreateData()
	{
		return new AData();
	}
};

//AData *data = (AData*)IFactory&lt;AFactory&gt;::CreateData();
</code></pre>
<p>Hat jemand eine Idee, wie ich das Problem lösen kann?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292412/static-und-abgeleitete-klasse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 02:11:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292412.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Sep 2011 06:43:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 06:43:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche sowas hier (was ja logischerweise nicht geht)</p>
<pre><code class="language-cpp">class IData
{
	...
};

class IFactory
{
public:
	static IData* CreateData() = 0;
};

class AData : public IData
{
	...
};

class AFactory : public IFactory
{
public:
	static IData* CreateData()
	{
		return new AData();
	}
};
</code></pre>
<p>Später möchte ich nur IFactory::CreateData() aufrufen, um das spezifische Data-Objekt zu bekommen.</p>
<p>Ich dachte man könnte das über Templates lösen, was aber im Nachhinein Quatsch ist <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="😉"
    /> weil man dort auch den richtigen Klassennamen angeben muss.</p>
<pre><code class="language-cpp">template &lt;class Derived&gt;
class IFactory
{
public:
	static IData* CreateData() { return Derived::CreateData(); }
};

class AFactory : public IFactory&lt;AFactory&gt;
{
public:
	static IData* CreateData()
	{
		return new AData();
	}
};

//AData *data = (AData*)IFactory&lt;AFactory&gt;::CreateData();
</code></pre>
<p>Hat jemand eine Idee, wie ich das Problem lösen kann?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117082</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 09 Sep 2011 06:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 07:12:48 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Hat jemand eine Idee, wie ich das Problem lösen kann?</p>
</blockquote>
<p>Wenn du Vererbung benutzen willst bei den Factories, dann musst du davon eh ein Objekt haben, um es zu nutzen, dann kannst du auch das static weglassen und die create-Funktion zu einer ganz normalen virtuellen Methode machen.<br />
Ich weiß allerdings nicht so genau, was du damit erreichen willst. Vielleicht erklärst du es uns, dann kann man dir auch eine passende Lösung vorschlagen. Möchtest du zur Laufzeit die Factory austauschen können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117087</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Sep 2011 07:12:48 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 07:51:02 GMT]]></title><description><![CDATA[<p>IData ist in meinem Fall eigentlich IFont und ein Interface zu einer Schriftklasse. IFactory ist IRenderer, das einen Renderer darstellt (OpenGL, DirectX, etc).<br />
Ich brauche nun in einer weiteren Klasse die Möglichkeit eine Schrift erstellen zu lassen. Da man im fertigen Programm einfach den Renderer wechseln können soll, brauche ich nun eine Möglichkeit, dass wenn zB der OpenGL Renderer verwendet wird, mir an dieser Stelle eine OpenGL-Font zurückgegeben wird usw.</p>
<p>Ich glaube eine mehr oder weniger elegante Möglichkeit wäre das ganze so in der Art zu lösen:</p>
<pre><code class="language-cpp">class IRenderer
{
private:
	static IRenderer* instance;

public:
	static IFont* CreateFont()
	{
		return (IFont*)instance-&gt;CreateFont();
	}
};

class OpenGLRenderer : public IRenderer
{
public:
	OpenGLRenderer()
	{
		instance = this;
	}

	OpenGLFont* CreateFont()
	{
		...
	}
};
</code></pre>
<p>Wobei zumindest eine Instanz eines Renderers angelegt sein worden muss, was auch irgendwie doof ist.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117100</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 09 Sep 2011 07:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 12:28:18 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>IData ist in meinem Fall eigentlich IFont und ein Interface zu einer Schriftklasse. IFactory ist IRenderer, das einen Renderer darstellt (OpenGL, DirectX, etc).</p>
</blockquote>
<p>Dann sag das doch gleich <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>Ich glaube eine mehr oder weniger elegante Möglichkeit wäre das ganze so in der Art zu lösen:</p>
</blockquote>
<p>Nein, das ist nicht elegant. nicht weniger und schon garnicht mehr. Vor allem tut es nicht was du willst, offenbar hast du es nichtmal ausprobiert.</p>
<blockquote>
<p>Wobei zumindest eine Instanz eines Renderers angelegt sein worden muss, was auch irgendwie doof ist.</p>
</blockquote>
<p>Das muss es so oder so, siehe mein voriger Post.</p>
<blockquote>
<p>Da man im fertigen Programm einfach den Renderer wechseln können soll, brauche ich nun eine Möglichkeit, dass wenn zB der OpenGL Renderer verwendet wird, mir an dieser Stelle eine OpenGL-Font zurückgegeben wird usw.</p>
</blockquote>
<p>Dann speichere irgendwo einen Pointer auf einen abstrakten Renderer und hänge genau den Renderer darunter, den du verwenden willst. Für die Verwendung von (Laufzeit-) Polymorphie und virtuellen Funktionen kommst du da nicht rum.</p>
<p>Google mal nach dem Stichwort &quot;abstract factory pattern&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117243</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Sep 2011 12:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 13:09:20 GMT]]></title><description><![CDATA[<p>Ist total egal wie dein Design aussieht. Hier rennen so viele Superschlaue rum, die dein Design IMMER kritisieren werden. Denn die wissen eh generell alles besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117261</guid><dc:creator><![CDATA[Tjaaaa]]></dc:creator><pubDate>Fri, 09 Sep 2011 13:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 14:02:30 GMT]]></title><description><![CDATA[<p>getestet hab ich den Code nicht, da es mir mehr ums theoretische ging.</p>
<p>Die abstract factory hab ich mir angeschaut, aber das ist ja das was ich eh schon hab, wenn ich das static weglasse.<br />
Also läuft alles darauf hinaus, dass der Anwender zwingend am Anfang einen globalen Renderer initialisieren muss?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117301</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 09 Sep 2011 14:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 14:48:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Also läuft alles darauf hinaus, dass der Anwender zwingend am Anfang einen globalen Renderer initialisieren muss?</p>
</blockquote>
<p>Ja ... weil bei der initialisierung legt er doch spaeter wirdklich fest, welche renderer genommen werden ...</p>
<p>Generell kann man &quot;dein Thema&quot; auf 2 wege Loesen.</p>
<p>1. ueber Polymorphie:<br />
Die legst beim init, wahrscheinlich anhand von parametern (ini datei oder ähnliches) fest, welcher renderer verwendet wird. Dazu sind instanzen notwendig, weil die die Vtable brauchen um auf die richtigen Typen zu schiessen.<br />
Dein virtueller Construktor, aka Factory Methode duerfen also nicht statisch sein.</p>
<p>Vorteil: dein Programm kann dynamisch, also mit ein und den selben binaries, zwischen den renderern umgeschaltet werden.<br />
Nachteil: Polymorphie verhindert oft genug stack objecte und inlining. Ist dadurch grad beim erzeugen von objecten langsamer, bzw bietet keine &quot;performanten&quot; Loesungen an.</p>
<p>2. Generizitaet (Templates)<br />
Du legst irgendwo statisch, also im header ueber nen typedef fest, auf welche typen das schiesst.<br />
Deine Objecte sind dann meist auch nicht abgeleitet, sondern benutzen nur die selben Signaturen, und sind dadurch &quot;generisch&quot;. Also du tpyisierst alle deine Objecte vorher per templates.</p>
<p>Vorteil: Stack-Objecte laessen sich oefters verwenden, performanter.<br />
Nachteil: binaries sind nur fuer einen bestimmten Pfad gebaut. d.h. du schaltest mit dem kompilieren bzw der Distributierung zwischen den Rendern um.</p>
<p>Kann man meist entschaerfen, in dem man, den Renderer in dem Falle, komplett in eine dll auslagert, und fuer jeden Render seine eigene dll baut. Die app zieht dann dynamisch die entsprechende dll an, dann funktioniert die dynamische konfiguration wieder.<br />
Das dll interface muss aber dann auch binaer fest definiert / sein ... was meist in nen heftiges interface ausartet ... je nach funktionsumfang.</p>
<p>Du musst selber entscheiden was dir lieber ist.<br />
Einsteiger tun sich mit polymorphie oft leichter ... templates koennen schon ziemlich knoten ins Hirn machen <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>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117332</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 09 Sep 2011 14:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 14:57:58 GMT]]></title><description><![CDATA[<p>ok, dann danke ich euch mal bis dahin und werde denk ich den Weg über Polymorphie wählen, passt besser zum bisherigen Stand der Dinge.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117338</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 09 Sep 2011 14:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 15:27:09 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Nachteil: Polymorphie verhindert oft genug stack objecte</p>
</blockquote>
<p>Polymorphie hat nur leider absolut gar nichts mit dem Stack zu tun, die funktioniert da auch. Das Problem, welches du meinst, nennt sich Slicing.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117352</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 09 Sep 2011 15:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 16:36:48 GMT]]></title><description><![CDATA[<p>Rein theoretisch kannst du natürlich auch deiner Renderer-Klasse eine statische create-Funktion und einen statischen Funktionspointer verpassen, den diese Funktion dann aufruft. so kannst du zur Laufzeit die tatsächliche create-Funktion dann auswechseln:</p>
<pre><code class="language-cpp">class IRenderer
{
private:
    // --
    // instance brauchst du nicht, um eine statische Funktion aufzurufen
    typedef IFont *FontCreator();
    static FontCreator creator;
public:
    static IFont* createFont()
    {
        return creator();
    }

    static void setCreator(FontCreator c)
    {
        creator = c;
    }
};

IFont* createOpenGLFont()
{
   return new OpenGLFont;
}

// ...

int main()
{
  IRenderer::setCreator(&amp;createOpenGLFont);

  IFont* pfont = IRenderer::createFont();

  if (dynamic_cast&lt;ObenGLFont*&gt;(pfont))
  {
     cout &lt;&lt; &quot;Got it!&quot;;
  }
}
</code></pre>
<p>Kann man natürlich noch erweitern, mit Vor- und Nachbearbeitung unabhängig von der Erzeugerfunktion, std::function statt der Funktionspointer, deleter-Funktion usw. Hab da mal vor ein paar Wochen ein entsprechend frei parametrisierbares Template gebastelt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117379</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Sep 2011 16:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to static und abgeleitete Klasse on Fri, 09 Sep 2011 17:31:47 GMT]]></title><description><![CDATA[<p>findet sich das Template hier irgendwo im Forum?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2117417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2117417</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 09 Sep 2011 17:31:47 GMT</pubDate></item></channel></rss>