<?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[Named Parameters mit Ableitung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Szenario:<br />
Es gibt eine Hierarchie von (Aufgaben-)Klassen, deren Konstruktoren eine große Anzahl von Parametern brauchen, von denen aber viele optional sein können.<br />
Klassen weiter unten in der Ableitungshierarchie brauchen immer die Parameter der Basisklasse(n) und noch ein paar mehr.</p>
<p>Idee:<br />
Die Parameter werden in eine andere (Parameter-)Klasse verpackt. Von dieser Parameter-Klasse wird dann ein Objekt an den Konstruktor der Aufgaben-Klassen übergeben. Damit erspart man sich Konstruktoren mit zig Parametern und Konstruktoren mit endlosen Parameterkombinationen.<br />
Um Code-Duplikation zu vermeiden, wäre es hilfreich, wenn man die Parameter-Klassen parallel zu den Aufgaben-Klassen in einer eigenen Hierarchie erweitern könnte.<br />
Außerdem sollten die Named Parameters in einer Fluent-Syntax geschrieben werden können.</p>
<p>Vereinfacht ungefähr so:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct t_base_params
{
   t_base_params&amp; set_i( int p_i )
   {
      m_i = p_i;
      return( *this );
   }

   t_base_params&amp; set_d( double p_d )
   {
      m_d = p_d;
      return( *this );
   }

   t_base_params&amp; set_s( const std::string&amp; p_s )
   {
      m_s = p_s;
      return( *this );
   }

   int m_i;
   double m_d;
   std::string m_s;
};

class t_base
{
public:
   t_base( const t_base_params&amp; p_params )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
   }
};

struct t_derived_0_params: public t_base_params
{
   t_derived_0_params&amp; set_c( char p_c )
   {
      m_c = p_c;
      return( *this );
   }

   char m_c;
};

class t_derived_0: public t_base
{
public:
   t_derived_0( const t_derived_0_params&amp; p_params ):
      t_base( p_params )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_c &lt;&lt; std::endl;
   }
};

int main()
{
   t_base base_0( t_base_params().set_s( &quot;Hallo&quot; ).set_d( 18.87 ).set_i( 33 ) );
   t_derived_0 derived_0_0 ( t_derived_0_params().set_d( 123.456) .set_c( 'x' ) );

   std::string dummy;
   std::cin &gt;&gt; dummy;
}
</code></pre>
<p>Das funktioniert so leider nicht, da die Methoden aus der Basisklasse immer noch Referenzen auf ein Basisklassenobjekt liefern.<br />
Und ich möchte die Methoden nicht virtuell machen und überschreiben, sonst habe ich ja trotzdem die Code-Verdopplung.<br />
Was ich eigentlich bräuchte, wäre eine Methode, die immer den Typ der aktuellen Klasse zurück gibt.<br />
Template ginge auch, wenn man den Rückgabetyp als Parameter angibt, aber dann wird der Aufruf sehr unschön.</p>
<p>Diese Lösung geht - aber elegant ist anders:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

template&lt; class t_return &gt;
struct t_base_params
{
   t_base_params():
      m_i( 0 ),
      m_d( 0.0 ),
      m_s( &quot;&quot; )
   {
   }

   template&lt; class t_source &gt;
   t_base_params( const t_source&amp; t_rhs ):
      m_i( t_rhs.m_i ),
      m_d( t_rhs.m_d ),
      m_s( t_rhs.m_s )
   {
   }

   t_return&amp; set_i( int p_i )
   {
      m_i = p_i;
      return( me() );
   }

   t_return&amp; set_d( double p_d )
   {
      m_d = p_d;
      return( me() );
   }

   t_return&amp; set_s( const std::string&amp; p_s )
   {
      m_s = p_s;
      return( me() );
   }

   int m_i;
   double m_d;
   std::string m_s;

protected:
   t_return&amp; me()
   {
      return( static_cast&lt; t_return&amp; &gt;( *this ) );
   }
};

class t_base
{
public:
   struct t_params: public t_base_params&lt; t_params &gt;
   {
      t_params():
         t_base_params&lt; t_params &gt;()
      {
      }

      t_params( const t_base_params&lt; t_params &gt;&amp; t_rhs ):
         t_base_params&lt; t_params &gt;( t_rhs )
      {
      }
   };

   t_base( const t_params&amp; p_params = t_params() )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
   }
};

template&lt; typename t_return &gt;
struct t_derived_0_params: public t_base_params&lt; t_return &gt;
{
   t_return&amp; set_c( char p_c )
   {
      m_c = p_c;
      return( me() );
   }

   char m_c;
};

class t_derived_0: public t_base
{
public:
   struct t_params: public t_derived_0_params&lt; t_params &gt;
   {
      t_params():
         t_derived_0_params&lt; t_params &gt;()
      {
      }

      t_params( const t_derived_0_params&lt; t_params &gt;&amp; t_rhs ):
         t_derived_0_params&lt; t_params &gt;( t_rhs )
      {
      }
   };

   t_derived_0( const t_params&amp; p_params ):
      t_base()
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_c &lt;&lt; std::endl;
   }
};

int main()
{
   t_base base_0( t_base::t_params().set_s( &quot;Hallo&quot; ).set_d( 18.87 ).set_i( 33 ) );
   t_derived_0 derived_0_0 ( t_derived_0::t_params().set_d( 123.456) .set_c( 'x' ) );

   std::string dummy;
   std::cin &gt;&gt; dummy;
}
</code></pre>
<p>Gibt es eine sinnvolle und elegante Lösung für dieses Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303674/named-parameters-mit-ableitung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 07:23:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303674.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 May 2012 09:20:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 09:20:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Szenario:<br />
Es gibt eine Hierarchie von (Aufgaben-)Klassen, deren Konstruktoren eine große Anzahl von Parametern brauchen, von denen aber viele optional sein können.<br />
Klassen weiter unten in der Ableitungshierarchie brauchen immer die Parameter der Basisklasse(n) und noch ein paar mehr.</p>
<p>Idee:<br />
Die Parameter werden in eine andere (Parameter-)Klasse verpackt. Von dieser Parameter-Klasse wird dann ein Objekt an den Konstruktor der Aufgaben-Klassen übergeben. Damit erspart man sich Konstruktoren mit zig Parametern und Konstruktoren mit endlosen Parameterkombinationen.<br />
Um Code-Duplikation zu vermeiden, wäre es hilfreich, wenn man die Parameter-Klassen parallel zu den Aufgaben-Klassen in einer eigenen Hierarchie erweitern könnte.<br />
Außerdem sollten die Named Parameters in einer Fluent-Syntax geschrieben werden können.</p>
<p>Vereinfacht ungefähr so:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

struct t_base_params
{
   t_base_params&amp; set_i( int p_i )
   {
      m_i = p_i;
      return( *this );
   }

   t_base_params&amp; set_d( double p_d )
   {
      m_d = p_d;
      return( *this );
   }

   t_base_params&amp; set_s( const std::string&amp; p_s )
   {
      m_s = p_s;
      return( *this );
   }

   int m_i;
   double m_d;
   std::string m_s;
};

class t_base
{
public:
   t_base( const t_base_params&amp; p_params )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
   }
};

struct t_derived_0_params: public t_base_params
{
   t_derived_0_params&amp; set_c( char p_c )
   {
      m_c = p_c;
      return( *this );
   }

   char m_c;
};

class t_derived_0: public t_base
{
public:
   t_derived_0( const t_derived_0_params&amp; p_params ):
      t_base( p_params )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_c &lt;&lt; std::endl;
   }
};

int main()
{
   t_base base_0( t_base_params().set_s( &quot;Hallo&quot; ).set_d( 18.87 ).set_i( 33 ) );
   t_derived_0 derived_0_0 ( t_derived_0_params().set_d( 123.456) .set_c( 'x' ) );

   std::string dummy;
   std::cin &gt;&gt; dummy;
}
</code></pre>
<p>Das funktioniert so leider nicht, da die Methoden aus der Basisklasse immer noch Referenzen auf ein Basisklassenobjekt liefern.<br />
Und ich möchte die Methoden nicht virtuell machen und überschreiben, sonst habe ich ja trotzdem die Code-Verdopplung.<br />
Was ich eigentlich bräuchte, wäre eine Methode, die immer den Typ der aktuellen Klasse zurück gibt.<br />
Template ginge auch, wenn man den Rückgabetyp als Parameter angibt, aber dann wird der Aufruf sehr unschön.</p>
<p>Diese Lösung geht - aber elegant ist anders:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

template&lt; class t_return &gt;
struct t_base_params
{
   t_base_params():
      m_i( 0 ),
      m_d( 0.0 ),
      m_s( &quot;&quot; )
   {
   }

   template&lt; class t_source &gt;
   t_base_params( const t_source&amp; t_rhs ):
      m_i( t_rhs.m_i ),
      m_d( t_rhs.m_d ),
      m_s( t_rhs.m_s )
   {
   }

   t_return&amp; set_i( int p_i )
   {
      m_i = p_i;
      return( me() );
   }

   t_return&amp; set_d( double p_d )
   {
      m_d = p_d;
      return( me() );
   }

   t_return&amp; set_s( const std::string&amp; p_s )
   {
      m_s = p_s;
      return( me() );
   }

   int m_i;
   double m_d;
   std::string m_s;

protected:
   t_return&amp; me()
   {
      return( static_cast&lt; t_return&amp; &gt;( *this ) );
   }
};

class t_base
{
public:
   struct t_params: public t_base_params&lt; t_params &gt;
   {
      t_params():
         t_base_params&lt; t_params &gt;()
      {
      }

      t_params( const t_base_params&lt; t_params &gt;&amp; t_rhs ):
         t_base_params&lt; t_params &gt;( t_rhs )
      {
      }
   };

   t_base( const t_params&amp; p_params = t_params() )
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
   }
};

template&lt; typename t_return &gt;
struct t_derived_0_params: public t_base_params&lt; t_return &gt;
{
   t_return&amp; set_c( char p_c )
   {
      m_c = p_c;
      return( me() );
   }

   char m_c;
};

class t_derived_0: public t_base
{
public:
   struct t_params: public t_derived_0_params&lt; t_params &gt;
   {
      t_params():
         t_derived_0_params&lt; t_params &gt;()
      {
      }

      t_params( const t_derived_0_params&lt; t_params &gt;&amp; t_rhs ):
         t_derived_0_params&lt; t_params &gt;( t_rhs )
      {
      }
   };

   t_derived_0( const t_params&amp; p_params ):
      t_base()
   {
      std::cout &lt;&lt; p_params.m_i &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_d &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_s &lt;&lt; std::endl;
      std::cout &lt;&lt; p_params.m_c &lt;&lt; std::endl;
   }
};

int main()
{
   t_base base_0( t_base::t_params().set_s( &quot;Hallo&quot; ).set_d( 18.87 ).set_i( 33 ) );
   t_derived_0 derived_0_0 ( t_derived_0::t_params().set_d( 123.456) .set_c( 'x' ) );

   std::string dummy;
   std::cin &gt;&gt; dummy;
}
</code></pre>
<p>Gibt es eine sinnvolle und elegante Lösung für dieses Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213325</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Sun, 20 May 2012 09:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 09:32:18 GMT]]></title><description><![CDATA[<p>Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213327</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 20 May 2012 09:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:01:25 GMT]]></title><description><![CDATA[<p>Nehmen wir die Klassenhierarchie als gegeben:</p>
<pre><code class="language-cpp">struct base
{
	int m_i;
};

struct derived : base
{
	double m_d;
};
</code></pre>
<p>Zuerst schreiben wir ein paar Attribut-Klassen, um den Objekten einen Wert zuzuweisen:</p>
<pre><code class="language-cpp">struct attribute_i
{
    explicit attribute_i(int i)
    : m_i(i)
    {
    }

    template &lt;typename T&gt;
    void modify(T&amp; target) const
    {
       target.m_i = m_i;
    }

    int m_i;
};

// Analog für andere wie attribute_d. Wenn es zu viel Code wird, 
// verwende Makros
</code></pre>
<p>Um eine schöne Syntax zu ermöglichen, überladen wir den <code>operator&lt;&lt;</code> . Dabei habe ich <code>std::enable_if</code> verwendet, damit der Operator nicht für sämtliche Argumenttypen im Namensraum herangezogen wird.</p>
<pre><code class="language-cpp">#include &lt;type_traits&gt;

template &lt;typename T, typename A&gt;
typename std::enable_if&lt;std::is_base_of&lt;base, T&gt;::value, T&amp;&gt;::type operator&lt;&lt; (T&amp; target, A attribute)
{
    attribute.modify(target);
    return target;
}
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">int main()
{
	base b;
	b &lt;&lt; attribute_i(2);

	derived d;
	d &lt;&lt; attribute_i(3) &lt;&lt; attribute_d(4.5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2213337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213337</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 20 May 2012 10:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:20:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>dot schrieb:</p>
<blockquote>
<p>Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...</p>
</blockquote>
<p>Bei den Klassen handelt es sich um Teile eines Abstraktions-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden viele und viele verschiedene Parameter gesetzt. Daran läßt sich erst einmal wenig ändern.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Danke für den interessanten Ansatz. Den werde ich genauer anschauen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213347</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Sun, 20 May 2012 10:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:29:34 GMT]]></title><description><![CDATA[<p><a href="http://img4.fotos-hochladen.net/uploads/void666tujm5byvnr.png" rel="nofollow">http://img4.fotos-hochladen.net/uploads/void666tujm5byvnr.png</a><br />
*angst hab*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213349</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 20 May 2012 10:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:45:48 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p><a href="http://img4.fotos-hochladen.net/uploads/void666tujm5byvnr.png" rel="nofollow">http://img4.fotos-hochladen.net/uploads/void666tujm5byvnr.png</a><br />
*angst hab*</p>
</blockquote>
<p>Der Teufel benutzt void* Zeiger? Interessant... der Code ist bestimmt die Hölle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213355</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 May 2012 10:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:46:54 GMT]]></title><description><![CDATA[<p>Meine Güte, schafft ihr es auch mal, einen Thread nicht vollzuspammen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213356</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 20 May 2012 10:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 10:50:33 GMT]]></title><description><![CDATA[<p>void* schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...</p>
</blockquote>
<p>Bei den Klassen handelt es sich um Teile eines <strong>Abstraktion</strong>s-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden <strong>viele und viele verschiedene Parameter</strong> gesetzt. Daran läßt sich erst einmal wenig ändern.</p>
</blockquote>
<p>hmmm</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213358</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 20 May 2012 10:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 14:56:52 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>void* schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...</p>
</blockquote>
<p>Bei den Klassen handelt es sich um Teile eines <strong>Abstraktion</strong>s-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden <strong>viele und viele verschiedene Parameter</strong> gesetzt. Daran läßt sich erst einmal wenig ändern.</p>
</blockquote>
<p>hmmm</p>
</blockquote>
<p>Hmmm?</p>
<p>Gemeint sind Parameter wie Größe, Position, Farben, Fonts, Initialisierungswerte für den Inhalt von Steuerelementen (Texte), Beschriftungen, ... eben die diversen Properties, die für ein Widget gesetzt werden können. Und da der Code teilweise 20 Jahre auf dem Buckel hat, viele Entwickler dran rumgeschraubt haben, von Unix auf Windows portiert wurde und sonst einiges mitgemacht hat, ist die Benutzung der Grundlagenbibliotheken eben etwas inhomogen.<br />
Und mit viele verschiedene Parameter ist eben gemeint, dass z.B. bei einer Combo-Box mal 7 Werte gesetzt werden und einmal 9, wovon 5 gleich sind wie beim ersten Aufruf und 4 eben anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213454</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Sun, 20 May 2012 14:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Sun, 20 May 2012 17:27:11 GMT]]></title><description><![CDATA[<p>void* schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>void* schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...</p>
</blockquote>
<p>Bei den Klassen handelt es sich um Teile eines <strong>Abstraktion</strong>s-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden <strong>viele und viele verschiedene Parameter</strong> gesetzt. Daran läßt sich erst einmal wenig ändern.</p>
</blockquote>
<p>hmmm</p>
</blockquote>
<p>Hmmm?</p>
<p>Gemeint sind Parameter wie Größe, Position, Farben, Fonts, Initialisierungswerte für den Inhalt von Steuerelementen (Texte), Beschriftungen, ... eben die diversen Properties, die für ein Widget gesetzt werden können.</p>
</blockquote>
<p>Und da liegt der Hund begraben. Muss das alles in eine Klasse? Kann das nicht in Datenstrukturen unterteilt werden? Das ist eben unschönes Design...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213499</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 May 2012 17:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Mon, 21 May 2012 08:49:05 GMT]]></title><description><![CDATA[<p>Unabhängig davon, ob es gutes Design ist, oder nicht: <a href="http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Parameter" rel="nofollow">Named Parameter Idiom</a>. Ist also ne durchaus &quot;gängige&quot; Lösung, so wie der TO es macht. Häßlich ist es allemal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213663</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 21 May 2012 08:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Named Parameters mit Ableitung on Mon, 21 May 2012 10:33:51 GMT]]></title><description><![CDATA[<p>Ich denk mal, dass die vielen Parameter an sich schon unschönes Design offenlegen, wurde jetzt genug bekrittelt.<br />
Wenn du darauf bestehst, es so zu machen, gibts aber wohl keine viel elegantere Möglichkeit als die von dir schon genannte CRTP-Version oder etwas wie das, was Nexus angesprochen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213702</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 May 2012 10:33:51 GMT</pubDate></item></channel></rss>