<?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[Interfaces und Paramter]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin neu hier und hab auch gleich ein konkretes Problem, das mir schon öfters begegnet ist.</p>
<p>Ich habe folgendes Interface:</p>
<pre><code class="language-cpp">class Abstract
{
public:
  DoSomething();
};
</code></pre>
<p>und davon zwei konkrete Klassen</p>
<pre><code class="language-cpp">class Konkret1
{
public:
  DoSomething();
  SetDoubleParam(double);
};

class Konkret2
{
public:
  DoSomething();
  SetStringParam(string);
}
</code></pre>
<p>Die beiden konkreten Klassen habe unterschiedliche Parameter, die von aussen änderbar sein sollen. Dadurch verlieren die beiden Klassen aber ihr einheitliches Interface was im weiteren Programmverlauf zu Komplikation führen kann.</p>
<p>Habt ihr da irgendwelche Ideen oder Erfahrungen wie man dieses Problem umgehen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188270/interfaces-und-paramter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 01:59:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188270.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Jul 2007 19:43:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 19:43:56 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bin neu hier und hab auch gleich ein konkretes Problem, das mir schon öfters begegnet ist.</p>
<p>Ich habe folgendes Interface:</p>
<pre><code class="language-cpp">class Abstract
{
public:
  DoSomething();
};
</code></pre>
<p>und davon zwei konkrete Klassen</p>
<pre><code class="language-cpp">class Konkret1
{
public:
  DoSomething();
  SetDoubleParam(double);
};

class Konkret2
{
public:
  DoSomething();
  SetStringParam(string);
}
</code></pre>
<p>Die beiden konkreten Klassen habe unterschiedliche Parameter, die von aussen änderbar sein sollen. Dadurch verlieren die beiden Klassen aber ihr einheitliches Interface was im weiteren Programmverlauf zu Komplikation führen kann.</p>
<p>Habt ihr da irgendwelche Ideen oder Erfahrungen wie man dieses Problem umgehen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334574</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Sun, 29 Jul 2007 19:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 19:50:38 GMT]]></title><description><![CDATA[<p>inwiefern kommt es da zu komplikationen ?<br />
solltest dein problem schon etwas besser darstellen</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334582</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 29 Jul 2007 19:50:38 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 20:02:14 GMT]]></title><description><![CDATA[<p>Ok, war vielleicht etwas kurz.</p>
<p>Ich will dann folgende Klasse erstellen</p>
<pre><code class="language-cpp">class Application
{
protected:
  Abstract *a_x,*a_y;
public:
  Application(int i)
  {
    switch(i){
      case 1: a_x=new Konkret1();a_y=new Konkret1(); break;
      case 2: a_x=new Konkret2();a_y=new Konkret2(); break;
    }
  }
  DoSomething(){a_x-&gt;DoSomething();a_y-&gt;DoSomething();};
};
</code></pre>
<p>Ich bin mir hier noch nicht sicher, ob man die Instanzierung der Member a_x und a_y noch besser lösen könnte. Das eigentliche Problem ist eher bei mir, dass ich von aussen nicht mehr die Parameter von a_x und a_y ändern kann. Vielleicht ist mein Ansatz auch nicht optimal.</p>
<p>Trotzdem schonmal ein grossen Dankeschön für Eure Hilfe</p>
<p>headmyshoulder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334592</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Sun, 29 Jul 2007 20:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 20:39:39 GMT]]></title><description><![CDATA[<p>Naja, du kannst die &quot;SetParam&quot; Methode ins Interface mit aufnehmen. Als Parameter übergibst du dann z.B. einen string, und den konvertierst du in der Klasse die ein double braucht einfach in ein double. Übergeben tust du dann eben die String-Darstellung des doubles, also vielleicht &quot;1.234&quot; o.ä.</p>
<p>Das könnte dein Problem lösen - kommt halt drauf an was das eigentliche Problem ist.<br />
Wenn es aber reicht das Parameter beim Erstellen zu setzen, dann brauchst du weiter garnix zu machen, dann setzt du es eben einfach beim erstellen:</p>
<pre><code class="language-cpp">Application(int i)
  {
    switch(i){
      case 1:
        a_x=new Konkret1();
        static_cast&lt;Konkret1*&gt;(a_x)-&gt;SetParam(123);
        a_y=new Konkret1();
        static_cast&lt;Konkret1*&gt;(a_y)-&gt;SetParam(234);
        break;
    // ...
    }
  }
</code></pre>
<p>Oder du gibst es gleich dem Konstruktor mit:</p>
<pre><code class="language-cpp">Application(int i)
  {
    switch(i){
      case 1:
        a_x=new Konkret1(123);
        a_y=new Konkret1(234);
        break;
    // ...
    }
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1334620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334620</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 29 Jul 2007 20:39:39 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 20:45:04 GMT]]></title><description><![CDATA[<p>Ja, an die beiden Varianten habe ich auch schon gedacht. Die Variante mit dem Strings und dem Casten find ich nicht so elegant und die Variante des Parametersetzen bei Erzeugen schränkt die Funktionalität ein wenig ein.</p>
<p>Das Problem kommt mir recht allgemein vor. Vielleicht gibts es dafür ja irgendeine allgemeine Lösung oder ein Design Pattern was das vereinheitlicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334624</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Sun, 29 Jul 2007 20:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Sun, 29 Jul 2007 21:09:36 GMT]]></title><description><![CDATA[<p>Ahh, mir fällt gerade was ein. Mann könnte ja die beiden Objekte a_x und a_y draussen erzeugen, also</p>
<pre><code class="language-cpp">class class Application
{
protected:
  Abstract *a_x,*a_y;
public:
  Application(Abstract *_a_x,Abstract *_a_y){a_x=_a_x;a_y=_a_y;};
  DoSomething(){a_x-&gt;DoSomething();a_y-&gt;DoSomething();};
  SetAX(Abstract *_a_x) { a_x=_a_x; };
  // usw....
};

Konkret1 *a_x=new Konkret1(),*a_y=new Konkret1();

Application app(a_x,a_y);
</code></pre>
<p>Dann kann man die Objekte von aussen manipulieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334637</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Sun, 29 Jul 2007 21:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Mon, 30 Jul 2007 07:01:37 GMT]]></title><description><![CDATA[<p>hoi</p>
<p>also wenn es keinen grund dafuer geben sollte, das man auf das object von aussen zugreifen koennen muss, waere folgendes auch eine moeglichkeit:</p>
<pre><code class="language-cpp">class Abstract
{
   public:
      virtual void DoSomething();
};

template&lt;class T&gt;
class KonkretBase : public Abstract
{
   public:
      typedef T value_type;

      KonkretBase(const T &amp;val) : value(val) { }
      void setParam(const T &amp;val) { value = val; }

   protected:
      T value;
};

class Konkret1 : public KonkretBase&lt;double&gt;
{
   public:
      Konkret1(double val) : KonkretBase&lt;double&gt;(val) { }
      void DoSomething(void) { /* do something */ }
};

class Konkret2 : public KonkretBase&lt;std::string&gt;
{
   public:
      Konkret2(const std::string &amp;val) : KonkretBase&lt;std::string&gt;(val) { }
      void DoSomething(void) { /* do something */ }
};

class Application
{
   public:
      Application(double x, double y)
      {
         val_x = new Konkret1(x);
         val_y = new Konkret1(y);
      }

      Application(const std::string &amp;x, const std::string &amp;y)
      {
         val_x = new Konkret2(x);
         val_y = new Konkret2(y);
      }

      void setNewParam(double x, double y)
      {
         static_cast&lt;Konkret1*&gt;(val_x)-&gt;setParam(x);
         static_cast&lt;Konkret1*&gt;(val_y)-&gt;setParam(y);
      }

      void setNewParam(const std::string &amp;x, const std::string &amp;y)
      { 
         static_cast&lt;Konkret2*&gt;(val_x)-&gt;setParam(x);
         static_cast&lt;Konkret2*&gt;(val_y)-&gt;setParam(y);
      }

      void DoSomething(void)
      {
         val_x-&gt;DoSomething();
         val_y-&gt;DoSomething();
      }

   protected:
      Abstract *val_x, *val_y;
};
</code></pre>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334742</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Mon, 30 Jul 2007 07:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Mon, 30 Jul 2007 22:22:26 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>hoi</p>
<p>also wenn es keinen grund dafuer geben sollte, das man auf das object von aussen zugreifen koennen muss, waere folgendes auch eine moeglichkeit:</p>
<pre><code class="language-cpp">class Abstract
{
   public:
      virtual void DoSomething();
};

template&lt;class T&gt;
class KonkretBase : public Abstract
{
   public:
      typedef T value_type;
   
      KonkretBase(const T &amp;val) : value(val) { }
      void setParam(const T &amp;val) { value = val; }

   protected:
      T value;
};

class Konkret1 : public KonkretBase&lt;double&gt;
{
   public:
      Konkret1(double val) : KonkretBase&lt;double&gt;(val) { }
      void DoSomething(void) { /* do something */ }
};

class Konkret2 : public KonkretBase&lt;std::string&gt;
{
   public:
      Konkret2(const std::string &amp;val) : KonkretBase&lt;std::string&gt;(val) { }
      void DoSomething(void) { /* do something */ }
};

class Application
{
   public:
      Application(double x, double y)
      {
         val_x = new Konkret1(x);
         val_y = new Konkret1(y);
      }
      
      Application(const std::string &amp;x, const std::string &amp;y)
      {
         val_x = new Konkret2(x);
         val_y = new Konkret2(y);
      }
      
      void setNewParam(double x, double y)
      {
         static_cast&lt;Konkret1*&gt;(val_x)-&gt;setParam(x);
         static_cast&lt;Konkret1*&gt;(val_y)-&gt;setParam(y);
      }
      
      void setNewParam(const std::string &amp;x, const std::string &amp;y)
      { 
         static_cast&lt;Konkret2*&gt;(val_x)-&gt;setParam(x);
         static_cast&lt;Konkret2*&gt;(val_y)-&gt;setParam(y);
      }
      
      void DoSomething(void)
      {
         val_x-&gt;DoSomething();
         val_y-&gt;DoSomething();
      }
      
   protected:
      Abstract *val_x, *val_y;
};
</code></pre>
<p>Meep Meep</p>
</blockquote>
<p>???<br />
Inwieweit soll das gut und richtig sein? Dann muss der Aufrufer ja wissen welche Variante von setNewParam er aufrufen darf!?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335324</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 30 Jul 2007 22:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Mon, 30 Jul 2007 22:29:22 GMT]]></title><description><![CDATA[<p>headmyshoulder schrieb:</p>
<blockquote>
<p>Ja, an die beiden Varianten habe ich auch schon gedacht. Die Variante mit dem Strings und dem Casten find ich nicht so elegant und die Variante des Parametersetzen bei Erzeugen schränkt die Funktionalität ein wenig ein.</p>
<p>Das Problem kommt mir recht allgemein vor. Vielleicht gibts es dafür ja irgendeine allgemeine Lösung oder ein Design Pattern was das vereinheitlicht.</p>
</blockquote>
<p>Ja, gibt es. Wurden schon genannt.<br />
BTW: bei der &quot;Variante mit den Strings&quot; wird nix gecastet sondern &quot;geparst&quot; oder &quot;konvertiert&quot; - was ein grosser Unterschied ist.</p>
<p>Eine andere oft verwendete Variante ist noch sich eine Art &quot;variant&quot; Typ zu basteln der dann z.B. einen int/double/string/wstring enthalten kann (aber eben nur eines davon), und den man fragen kann was er ist, und den man ggf. rumkonvertieren kann.<br />
Wenn du der &quot;setParam&quot; Funktion dann einen &quot;variant&quot; gibst der bereits ein double ist muss nixmehr konvertiert werden, wenn's was anderes ist muss eben doch konvertiert werden.</p>
<p>----</p>
<p>Was ist denn der genaue Anwendungsfall? Zu entscheiden was wohl das beste ist ist IMO nur möglich wenn man auch weiss wofür es verwendet werden soll...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335329</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 30 Jul 2007 22:29:22 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces und Paramter on Tue, 31 Jul 2007 07:24:13 GMT]]></title><description><![CDATA[<p>Das Problem was ich gerade habe ist eine Klasse, die numerisch Ableiten soll, z.B. mit Finiten Differenzen oder Splines oder im Spektralraum, d.h. meine Funktion DoSomething() ist in etwa sowas</p>
<pre><code class="language-cpp">void Deriv(double *in,double *deriv,int length)
</code></pre>
<p>Manche Methoden haben Parameter, z.B. bei FD und Splines die Ordnung und die Fensterbreite, andere Verfahren haben keine Parameter. Die Applikationsklasse soll einfach dann in zwei Dimensionen ableiten. Ich glaub ich werde das wie folgt lösen:</p>
<pre><code class="language-cpp">class class Application
{
protected:
  Abstract *a_x,*a_y;
public:
  Application() { a_x=new Konkret1(); a_y=new Konkret2(); };

  SetAX(Abstract *_a_x);
  Abstract* GetAX();

  // usw.
};

Application app(); 
Konkret2 *a_x=new Konkret2();
a_x-&gt;SetParam(10);
app.SetAX(a_x);
</code></pre>
<p>Also die Application wird erstmal mit zwei defaults erzeugt. Wenn man dann halt andere &quot;Ableiter&quot; haben will muss man die per Hand erzeugen und dann einfach der Application übergeben.</p>
<p>Das sieht für mich jetzt erstmal am einfachsten und elegantesten aus, man ist auch nicht mehr auf eine bestimmte Methode für die Parameter festgelegt, man könnte die zum Beispiel SetOrder(int) oder SetWindowSize(int) nennen, ohne das es KOnflikte gibt. Vielleicht hat jemand aber auch noch eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335423</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Tue, 31 Jul 2007 07:24:13 GMT</pubDate></item></channel></rss>