<?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[Bestehnde Klassen erweitern]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich programmiere an einem Spiel und benutze dabei die SFML Bibliothek. SFML bietet verschiedene Klassen an die von sf::Drawable abgeleitet sind, um im Fenster gezeichnet werden zu können, z.b. sf::Sprite für Bilder und sf::String für Texte.<br />
Um Drawables zu haben, die nicht immer angezeigt werden, behelfe ich mir im Moment mit einem zusätzlichen bool, da sowas von SFML nicht unterstützt wird. Das funktioniert, ist aber etwas unpraktisch. Um den Drawable Klassen ein Show()/Hide() zur Verfügung zu stellen hab ich mir folgendes überlegt.</p>
<p>Ich habe eine Klasse</p>
<pre><code class="language-cpp">template &lt;typename Base&gt;
class ExtendedDrawable : public Base
{
    bool visible;

public:
    ExtendedDrawable() : visible(true)
    { }

    void Show() { visible = true; }
    void Hide() { visible = false; }

    // und noch mehr ...

protected:
    // Die Render Methode wird von sf::Drawable vorgegeben
    void Render(sf::RenderTarget&amp; target) const
    {
        if (visible)
            Base::Render(target);
    }
};
</code></pre>
<p>und leite davon erweiterte sf::Sprite, sf::String und sowas ab:</p>
<pre><code class="language-cpp">namespace sfex
{
    typedef ExtendedDrawable&lt;sf::Sprite&gt; Sprite;
    typedef ExtendedDrawable&lt;sf::String&gt; String;
}
</code></pre>
<p>Die sfex::* Klassen sollten genau wie ihre Originalversionen aus sf:: benutzbar sein, auch im Zusammenspiel mit anderen SFML Funktionen.<br />
Das ganze funktioniert für ein paar Testobjekte gut.</p>
<p>Jetzt zur eigentlichen Frage:<br />
Gibt es bei so einer Vorgehensweise irgendwelche Probleme?<br />
Ich möchte nicht alle Objekte und die ganzen Mechanismen mit den zusätzlichen bools umstellen, um dann in zwei Wochen zu merken, dass ich mir damit nur in den Fuß schieße <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/topic/316034/bestehnde-klassen-erweitern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 07:14:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316034.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Apr 2013 15:43:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bestehnde Klassen erweitern on Fri, 19 Apr 2013 15:43:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich programmiere an einem Spiel und benutze dabei die SFML Bibliothek. SFML bietet verschiedene Klassen an die von sf::Drawable abgeleitet sind, um im Fenster gezeichnet werden zu können, z.b. sf::Sprite für Bilder und sf::String für Texte.<br />
Um Drawables zu haben, die nicht immer angezeigt werden, behelfe ich mir im Moment mit einem zusätzlichen bool, da sowas von SFML nicht unterstützt wird. Das funktioniert, ist aber etwas unpraktisch. Um den Drawable Klassen ein Show()/Hide() zur Verfügung zu stellen hab ich mir folgendes überlegt.</p>
<p>Ich habe eine Klasse</p>
<pre><code class="language-cpp">template &lt;typename Base&gt;
class ExtendedDrawable : public Base
{
    bool visible;

public:
    ExtendedDrawable() : visible(true)
    { }

    void Show() { visible = true; }
    void Hide() { visible = false; }

    // und noch mehr ...

protected:
    // Die Render Methode wird von sf::Drawable vorgegeben
    void Render(sf::RenderTarget&amp; target) const
    {
        if (visible)
            Base::Render(target);
    }
};
</code></pre>
<p>und leite davon erweiterte sf::Sprite, sf::String und sowas ab:</p>
<pre><code class="language-cpp">namespace sfex
{
    typedef ExtendedDrawable&lt;sf::Sprite&gt; Sprite;
    typedef ExtendedDrawable&lt;sf::String&gt; String;
}
</code></pre>
<p>Die sfex::* Klassen sollten genau wie ihre Originalversionen aus sf:: benutzbar sein, auch im Zusammenspiel mit anderen SFML Funktionen.<br />
Das ganze funktioniert für ein paar Testobjekte gut.</p>
<p>Jetzt zur eigentlichen Frage:<br />
Gibt es bei so einer Vorgehensweise irgendwelche Probleme?<br />
Ich möchte nicht alle Objekte und die ganzen Mechanismen mit den zusätzlichen bools umstellen, um dann in zwei Wochen zu merken, dass ich mir damit nur in den Fuß schieße <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/2316835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316835</guid><dc:creator><![CDATA[DerKuchen]]></dc:creator><pubDate>Fri, 19 Apr 2013 15:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Bestehnde Klassen erweitern on Fri, 19 Apr 2013 21:10:51 GMT]]></title><description><![CDATA[<p>Solange du nicht die originalen SFML Klassen auf deine Ansprüche ändern willst, also die SFML Source änderst, musst du für Änderungen eigene Klassen definieren, die halt von den SFML Klassen erben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316891</guid><dc:creator><![CDATA[Youka]]></dc:creator><pubDate>Fri, 19 Apr 2013 21:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to Bestehnde Klassen erweitern on Fri, 19 Apr 2013 22:35:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wichtig ist halt, dass die Methode auch virtual ist. Wenn Du sonst ein Basisklassenobjekt hast, das aber als eigentlichen Typen deine Klasse hat, wird sonst die Methode der Basisklasse aufgerufen. Auch der destructor von Base sollte virtual sein. Aber wenn SFML selbst Ableitungen anbietet, wird das wohl gegeben sein.</p>
<p>Ansonsten funktioniert Deine Variante, Vererbung ist eben eine Form der Erweiterung.</p>
<p>Eine andere wäre Komposition, Du könntest dann die Drawable-Klasse als Attribut halten, die üblichen Methoden anbieten und alle Aufrufe an die Drawable-Klasse weiterleiten. Vorteil ist die gesteigerte Dynamik, falls Deine Klasse noch mehr können sollte. Nachteil ist die Tipparbeit und v.a., dass Du dort, wo Drawable erwartet wird, nicht Deine Klasse übergeben kannst.</p>
<p>Dafür kriegst Du mit Vererbung z.B. nicht einen Text versteckt, sondern eben nur ein Basis-Drawable-Objekt. Wenn Du das über ein Attribut machst und beispielsweise über Templateparameter oder via constructor-Argument das Drawable übergibst, kannst Du jede Art von Drawable &quot;verstecken&quot;.</p>
<p>Ich würde mir die Frage stellen, was Dein extended Drawable überhaupt soll. Wieso muss die Sichtbarkeit Teil des Objekts sein? Ist das der einzige Grund für eine neue Klasse oder können da auch noch weitere Eigenschaften dazu kommen? Wenn ja, welcher Art?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316900</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 19 Apr 2013 22:35:53 GMT</pubDate></item></channel></rss>