<?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[Probleme mit Aufgabe zum Decorator Entwurfsmuster]]></title><description><![CDATA[<p>Hallo Leute ich habe da ein kleines Problem...</p>
<p>Ich habe anhand einer Aufgabenstellung dieses Programm geschrieben:<br />
<strong>Aufgabenstellung:</strong></p>
<blockquote>
<p>- dynamisch zur Laufzeit Funktionen der Gestalt f(x) = sin(cos(cos(x))), also beliebige<br />
Kombinationen aus sin und cos, erstellen und hierzu das Decorator-Entwurfsmuster verwenden<br />
- als ConcreteComponent wird die Funktion f(x) = x verwendet.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;math.h&gt;
#include &lt;exception&gt;
using namespace std;

class Component
{
      public:
             virtual float execute(float x) const =0;
             virtual ~Component() {}
};
class Identity : public Component
{
      public:
             virtual float execute(float x) const { return x;}
             virtual ~Identity() {}
};
// Exception-Klasse, falls keine innere Funktion vorliegt
class NoInnerFunction {};

//Anfang Ergänzungen

//Zusätzliche Ergänzungen1 - Anfang
class SuperSinCos : public Component
{
      public:
             virtual void setInnerFunction(Component&amp;);
};
//Zusätzliche Ergänzungen1 - Ende

class Cos : public SuperSinCos
{
      public:
             Component *innerFunction;
             void setInnerFunction(Component&amp;);
             float execute(float) const;
};

void Cos::setInnerFunction(Component&amp; comp)
{
     innerFunction = &amp;comp;
}

float Cos::execute(float x) const
{
          float a,b;
          try{
          a = innerFunction-&gt;execute(x);
          }
          catch(exception *)
          {}                  
          b = cos(a);
          return b;    
}             

class Sin : public SuperSinCos
{
      public:
             Component *innerFunction;
             void setInnerFunction(Component&amp;);
             float execute(float) const;
};

void Sin::setInnerFunction(Component&amp; comp)
{
     innerFunction = &amp;comp;
}

float Sin::execute(float x) const
{
      float a,b;
      a = innerFunction-&gt;execute(x);
      b = sin(a);
      return b;
}

/* 
class SinCos : public SuperSinCos, public Component
{
      public:
             Component *innerFunctionSin;
             Component *innerFunctionCos;
             void setInnerFunctionSin(Component&amp;);
             void setInnerFunctionCos(Component&amp;);
             float execute(float, float) const;
};
void SinCos::setInnerFunctionSin(Component&amp; comp)
{
     innerFunctionSin = &amp;comp;
}

void SinCos::setInnerFunctionCos(Component&amp; comp)
{
     innerFunctionCos = &amp;comp;
}

float SinCos::execute(float x, float y) const
{
      float a,b,c;
      a = innerFunctionSin-&gt;execute(x);
      b = innerFunctionCos-&gt;execute(y);
      c = sin(a)+cos(b);
      return c;
}
*/

//Ende Ergänzungen

int main()
{
    Identity i;
    Cos c1;
    c1.setInnerFunction(i);
    Cos c2;
    c2.setInnerFunction(c1);
    Sin s;
    s.setInnerFunction(c2);
    cout &lt;&lt; s.execute(0.0) &lt;&lt; endl;
    system(&quot;Pause&quot;); //Zusatz
    return 0;
}
</code></pre>
<p>Folgende Fehler muss ich aber noch korrigieren:</p>
<p>- SuperSinCos muss setInnerfunction implementieren<br />
- SuperSinCos muss von Component abgeleitet sein, Sin und Cos dann von SuoperSinCos aber nicht auch noch von Component<br />
- innerFunction-&gt;execute(x) knallt wenn innerFunction keinen gültigen Zeiger enthält. =&gt; Exception entwerfen!</p>
<p>Da ich aber schon mit dem bisherigen Programmieren größte Schwierigkeiten hatte, weiss ich momentan echt nicht, wie ich den Code noch umbauen muss. Vielleicht hat der ein oder ander ein paar Tipps für mich.<br />
1000 Dank schonmal.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/121404/probleme-mit-aufgabe-zum-decorator-entwurfsmuster</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 17:39:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/121404.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Sep 2005 07:07:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Aufgabe zum Decorator Entwurfsmuster on Fri, 23 Sep 2005 07:07:01 GMT]]></title><description><![CDATA[<p>Hallo Leute ich habe da ein kleines Problem...</p>
<p>Ich habe anhand einer Aufgabenstellung dieses Programm geschrieben:<br />
<strong>Aufgabenstellung:</strong></p>
<blockquote>
<p>- dynamisch zur Laufzeit Funktionen der Gestalt f(x) = sin(cos(cos(x))), also beliebige<br />
Kombinationen aus sin und cos, erstellen und hierzu das Decorator-Entwurfsmuster verwenden<br />
- als ConcreteComponent wird die Funktion f(x) = x verwendet.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;math.h&gt;
#include &lt;exception&gt;
using namespace std;

class Component
{
      public:
             virtual float execute(float x) const =0;
             virtual ~Component() {}
};
class Identity : public Component
{
      public:
             virtual float execute(float x) const { return x;}
             virtual ~Identity() {}
};
// Exception-Klasse, falls keine innere Funktion vorliegt
class NoInnerFunction {};

//Anfang Ergänzungen

//Zusätzliche Ergänzungen1 - Anfang
class SuperSinCos : public Component
{
      public:
             virtual void setInnerFunction(Component&amp;);
};
//Zusätzliche Ergänzungen1 - Ende

class Cos : public SuperSinCos
{
      public:
             Component *innerFunction;
             void setInnerFunction(Component&amp;);
             float execute(float) const;
};

void Cos::setInnerFunction(Component&amp; comp)
{
     innerFunction = &amp;comp;
}

float Cos::execute(float x) const
{
          float a,b;
          try{
          a = innerFunction-&gt;execute(x);
          }
          catch(exception *)
          {}                  
          b = cos(a);
          return b;    
}             

class Sin : public SuperSinCos
{
      public:
             Component *innerFunction;
             void setInnerFunction(Component&amp;);
             float execute(float) const;
};

void Sin::setInnerFunction(Component&amp; comp)
{
     innerFunction = &amp;comp;
}

float Sin::execute(float x) const
{
      float a,b;
      a = innerFunction-&gt;execute(x);
      b = sin(a);
      return b;
}

/* 
class SinCos : public SuperSinCos, public Component
{
      public:
             Component *innerFunctionSin;
             Component *innerFunctionCos;
             void setInnerFunctionSin(Component&amp;);
             void setInnerFunctionCos(Component&amp;);
             float execute(float, float) const;
};
void SinCos::setInnerFunctionSin(Component&amp; comp)
{
     innerFunctionSin = &amp;comp;
}

void SinCos::setInnerFunctionCos(Component&amp; comp)
{
     innerFunctionCos = &amp;comp;
}

float SinCos::execute(float x, float y) const
{
      float a,b,c;
      a = innerFunctionSin-&gt;execute(x);
      b = innerFunctionCos-&gt;execute(y);
      c = sin(a)+cos(b);
      return c;
}
*/

//Ende Ergänzungen

int main()
{
    Identity i;
    Cos c1;
    c1.setInnerFunction(i);
    Cos c2;
    c2.setInnerFunction(c1);
    Sin s;
    s.setInnerFunction(c2);
    cout &lt;&lt; s.execute(0.0) &lt;&lt; endl;
    system(&quot;Pause&quot;); //Zusatz
    return 0;
}
</code></pre>
<p>Folgende Fehler muss ich aber noch korrigieren:</p>
<p>- SuperSinCos muss setInnerfunction implementieren<br />
- SuperSinCos muss von Component abgeleitet sein, Sin und Cos dann von SuoperSinCos aber nicht auch noch von Component<br />
- innerFunction-&gt;execute(x) knallt wenn innerFunction keinen gültigen Zeiger enthält. =&gt; Exception entwerfen!</p>
<p>Da ich aber schon mit dem bisherigen Programmieren größte Schwierigkeiten hatte, weiss ich momentan echt nicht, wie ich den Code noch umbauen muss. Vielleicht hat der ein oder ander ein paar Tipps für mich.<br />
1000 Dank schonmal.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/878281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/878281</guid><dc:creator><![CDATA[carnage]]></dc:creator><pubDate>Fri, 23 Sep 2005 07:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Aufgabe zum Decorator Entwurfsmuster on Fri, 23 Sep 2005 07:48:03 GMT]]></title><description><![CDATA[<p>Wozu benötigst Du SinCos?<br />
Das erledigt doch gerade das Pattern, oder?<br />
Also SinCos =</p>
<pre><code class="language-cpp">Identity i;
    Cos c1;
    c1.setInnerFunction(i);  // cos(x)
    Sin sinCos;
    sinCos.setInnerFunction(c1); // sin(cos(x))
</code></pre>
<p>Die Implementation von setInnerFunction benötigst Du nur einmal in SuperSinCos (irgendwie kein so guter Name). Diese sieht genauso so aus, wie Du sie jetzt bei den abgeleiteten Klassen hast. (Mal abgesehen davon, dass die Signatur irreführend ist: Du erwartest eine Referenz und merkst Dir einen Zeiger darauf. Der Aufrufer kann das nicht wissen, übergibt Dir ggf. eine lokale Variable. Damit wird der Zeiger auf die innerFunction dann völlig unbemerkt ungültig)</p>
<p>Wenn Du keine gültige Funktion nach innerFunction steckst, dann knallt es immer, d.h. Du kannst es nicht über eine Exception abfangen. Du solltest aber im Konstrukor innerFunction auf NULL initialisieren und das in execute abprüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/878320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/878320</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Fri, 23 Sep 2005 07:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Aufgabe zum Decorator Entwurfsmuster on Fri, 23 Sep 2005 15:46:58 GMT]]></title><description><![CDATA[<p>Danke erstmal ... hab inzwischen denk ich das meiste hinbekommen, und könnte mir in den hintern beissen das ich nich selber drauf gekommen bin, war ja eigentlich nich schwer <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>
<p>Hier der aktuelle Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;math.h&gt;
using namespace std;

class Component
{
      public:
             virtual float execute(float x) const =0;
             virtual ~Component() {}
};
class Identity : public Component
{
      public:
             virtual float execute(float x) const {return x;}
             virtual ~Identity() {}
};
// Exception-Klasse, falls keine innere Funktion vorliegt
class NoInnerFunction {};

//Anfang Ergänzungen

//Zusätzliche Ergänzungen - Anfang

class SuperSinCos : public Component
{
      public:
             Component *innerFunction;
             void setInnerFunction(Component&amp;);
};

void SuperSinCos::setInnerFunction(Component&amp; comp)
{    
     innerFunction = &amp;comp;
}

//Zusätzliche Ergänzungen - Ende

class Cos : public SuperSinCos
{
      public:
             Cos();
             Component *innerFunction;
             float execute(float) const;
};

Cos::Cos() 
{
 innerFunction = NULL;
}

float Cos::execute(float x) const
{
          float a,b;
          if(innerFunction != NULL)
             a = innerFunction-&gt;execute(x);
          else 
              {cout &lt;&lt; &quot;Zeiger1&quot; &lt;&lt; endl;}
          b = cos(a);
          return b;    
}             

class Sin : public SuperSinCos
{
      public:
             Sin();
             Component *innerFunction;
             float execute(float) const;
};

Sin::Sin() 
{
 innerFunction = NULL;
}

float Sin::execute(float x) const
{
      float a,b;
      if(innerFunction != NULL)
         a = innerFunction-&gt;execute(x);
      else 
           {cout &lt;&lt; &quot;Zeiger2&quot; &lt;&lt; endl;}
      b = sin(a);
      return b;
}

//Ende Ergänzungen

int main()
{
    Identity i;
    Cos c1;
    c1.setInnerFunction(i);
    Cos c2;
    c2.setInnerFunction(c1);
    Sin s;
    s.setInnerFunction(c2);
    cout &lt;&lt; s.execute(0.0) &lt;&lt; endl;
    system(&quot;Pause&quot;); //Zusatz
    return 0;
}
</code></pre>
<p>Fehlt eigentlich nur noch das werfen der Exception, nur scheint es da wohl nen trick bei zu geben weil das nicht klappen will ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/878708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/878708</guid><dc:creator><![CDATA[carnage]]></dc:creator><pubDate>Fri, 23 Sep 2005 15:46:58 GMT</pubDate></item></channel></rss>