<?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[Decorator Pattern: Nutzung der abstrakten Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade das Decorator Pattern mit C++ zu realisieren.</p>
<p>Ich möchte folgenden Bauplan umsetzen:</p>
<pre><code class="language-cpp">//Abstrakte BasisKlasse 
class Basis{
   virtual void ichMache()=0;
}

// Konkrete Basisklasse

class Konkret: public Basis{
   ichMache(){
   //etwas
   }
}

//Abstrakte DecoratorKlasse

class Decorator : public BasisKlasse{

protected:
  Basis wrappedObject; // Genau hier beginnen die Probleme
}

// Konkreter Decorator
class ConcrectDecorator : public Decorator{

ichMacheNochMehr(){
   this-&gt;wrappedObjekt-&gt;IchMache();
   //Mache noch meh!
}
</code></pre>
<p>Nun ist es ja nicht möglich (oder doch) eine abstrakte Klasse als Member in der ebenfalls Abstrakten Klasse Decorator zu deklarieren.<br />
Der Compiler meldet:</p>
<pre><code>Feld »wrappedInDevice« kann nicht als vom abstrakten Typ »BasisKlasse« deklariert werden
Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »BasisKlasse«:	virtual void ichMache()
</code></pre>
<p>Die Basis-Klasse bzw. die konkrete Implementation davon muss doch im Decorator irgendwie gekapselt werden, damit man sie im konkreten Decorator nutzen kann.</p>
<p>Wo liegt der Überlegungsfehler?</p>
<p>M</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242418/decorator-pattern-nutzung-der-abstrakten-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 23:30:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242418.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Jun 2009 14:54:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Decorator Pattern: Nutzung der abstrakten Klasse on Wed, 03 Jun 2009 14:54:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade das Decorator Pattern mit C++ zu realisieren.</p>
<p>Ich möchte folgenden Bauplan umsetzen:</p>
<pre><code class="language-cpp">//Abstrakte BasisKlasse 
class Basis{
   virtual void ichMache()=0;
}

// Konkrete Basisklasse

class Konkret: public Basis{
   ichMache(){
   //etwas
   }
}

//Abstrakte DecoratorKlasse

class Decorator : public BasisKlasse{

protected:
  Basis wrappedObject; // Genau hier beginnen die Probleme
}

// Konkreter Decorator
class ConcrectDecorator : public Decorator{

ichMacheNochMehr(){
   this-&gt;wrappedObjekt-&gt;IchMache();
   //Mache noch meh!
}
</code></pre>
<p>Nun ist es ja nicht möglich (oder doch) eine abstrakte Klasse als Member in der ebenfalls Abstrakten Klasse Decorator zu deklarieren.<br />
Der Compiler meldet:</p>
<pre><code>Feld »wrappedInDevice« kann nicht als vom abstrakten Typ »BasisKlasse« deklariert werden
Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »BasisKlasse«:	virtual void ichMache()
</code></pre>
<p>Die Basis-Klasse bzw. die konkrete Implementation davon muss doch im Decorator irgendwie gekapselt werden, damit man sie im konkreten Decorator nutzen kann.</p>
<p>Wo liegt der Überlegungsfehler?</p>
<p>M</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720483</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Wed, 03 Jun 2009 14:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Decorator Pattern: Nutzung der abstrakten Klasse on Wed, 03 Jun 2009 15:13:37 GMT]]></title><description><![CDATA[<p>Du versuchst von einer abstarkten Basisklasse eine Instanz zu erzeugen, aber das geht nicht! Das ist der Sinn von abstrakten Basisklassen, sie dienen nur als Basis. Man darf nur von Ihnen ableiten.</p>
<pre><code class="language-cpp">class Decorator : public BasisKlasse{

protected:
  Basis&amp; wrappedObject; // Referenz (oder Zeiger) benutzen
                        // und dann Objekt vom Typ Konkret zuweisen.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1720492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720492</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 03 Jun 2009 15:13:37 GMT</pubDate></item><item><title><![CDATA[Reply to Decorator Pattern: Nutzung der abstrakten Klasse on Wed, 03 Jun 2009 15:13:09 GMT]]></title><description><![CDATA[<p>Du kannst kein abstraktes Objekt erstellen, aber eine Referenz oder, was hier wohl sinnvoll wäre, einen Zeiger auf ein abstraktes Objekt.</p>
<p>Übrigens, ich würde Klassenmember immer als <code>private</code> deklarieren. Ich habe noch keinen sinnvollen Anwendungsfall gesehen, welcher wirklich <code>public</code> oder <code>protected</code> Klassenmember erfordert hat.<br />
Mach lieber zugehörige Setter und Getter, welche du auch in Kindklassen benutzt, so ist die Kontrolle über die Variable einheitlicher, bzw. eindeutiger. Für die Fehlersuche ist das sehr hilfreich.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720494</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 03 Jun 2009 15:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Decorator Pattern: Nutzung der abstrakten Klasse on Fri, 05 Jun 2009 10:43:02 GMT]]></title><description><![CDATA[<p>Danke Roger Wilco und Dravere.</p>
<p>Eure Posts haben mir weiter geholfen. Der Vollständigkeit halber poste ich nocht die korrigiert Version:</p>
<pre><code class="language-cpp">//Abstrakte BasisKlasse
class Basis{
   virtual void ichMache()=0;
}

// Konkrete Basisklasse

class Konkret: public Basis{
   ichMache(){
   //etwas
   }
}

//Abstrakte DecoratorKlasse

class Decorator : public BasisKlasse{

private:
  Basis &amp; wrappedObject  ; // NEU: eine Referenz! -&gt; Problem gelöst
}

// Konkreter Decorator
class ConcrectDecorator : public Decorator{

ichMacheNochMehr(){
   this-&gt;wrappedObjekt.IchMache();
   //Mache noch meh!
}
</code></pre>
<p>Betreffend der Bemerkung von Dravere, auf Protected zu verzichten:<br />
Auf <a href="http://www.willemer.de/informatik/cpp/cpperben.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/cpperben.htm</a> habe ich folgendes gelesen:</p>
<blockquote>
<p>Eine abgeleitete Klasse kann nicht auf die privaten Elemente der Basisklasse zugreifen.</p>
</blockquote>
<p>Das würde heissen, dass meine konkreten Decorators nicht auf das wrapped-Object zugreifen können. D.h. muss ich doch die Member-Variable als protected deklarieren. Oder liege ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721673</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Fri, 05 Jun 2009 10:43:02 GMT</pubDate></item></channel></rss>