<?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[Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!)]]></title><description><![CDATA[<p>Hi,</p>
<p>angenommen ich habe eine Klasse mit einer statischen Variable. Der genaue Wert davon ist aber erst zur Laufzeit bekannt. Die Instanzen der Klasse brauchen einen vernünftig initialisierten Wert, um ihre Aufgabe zu erfüllen. Ungefähr so:</p>
<pre><code class="language-cpp">class foo{
private:
  static komplizierter_datentyp static_variable;
public:
  void leg_los()
  {
    // Benötigt static_variable
  }
  static void init(/*Parameter*/)
  {
    // Initialisiert static_variable;
  }
};
</code></pre>
<p>Kann man den Benutzer der Klasse irgendwie dazu zwingen, die init-Methode vor dem ersten leg_los() aufzurufen? Vorzugsweise mit Fehlermeldung zur Compilezeit? Ein assert zur Laufzeit wäre nur insofern hilfreich, als das es eine genauere Fehleranalyse erlaubt. Das Programm wird nämlich höchstwahrscheinlich ohnehin an der Stelle abstürzen, wenn ein uninitialisierter Wert benutzt wird.</p>
<p>Die beste Möglichkeit, die mir dazu einfällt, wäre ein Auslagern der Variable:</p>
<pre><code class="language-cpp">class foo{
public:
  void leg_los(komplizierter_datentyp &amp;parameter)
  {
    // Benutzt Parameter
  }
};
</code></pre>
<p>Dies stellt sicher, dass der benötigte Parameter initialisiert ist, da man die Funktion ohne gar nicht aufrufen könnte. aber kleiner Nachteil: Jetzt muss man sich als Benutzer um mehr kümmern. Im schlimmsten Fall muss man das ehemalige statische Objekt nun im ganzen Programm rumreichen oder gleich global machen. Das ist zwar erstmal Problem des Nutzers, dennoch finde ich dies unschön (vor allem da dieser Benutzer erstmal ich selbst bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).<br />
Es ist auch von der Modellierung nur halbschön, denn die statische Eigenschaft habe ich da anfangs nicht hingesetzt weil es den Code kürzer macht, sondern weil es sich auch vom Modell her um eine gemeinsame Eigenschaft aller Instanzen dieser Klasse handelt.</p>
<p>Gibt's da bessere Alternativen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271502/designfrage-alternative-für-init-methode-antwort-ist-nicht-der-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 11:26:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271502.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Jul 2010 14:50:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 14:50:41 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>angenommen ich habe eine Klasse mit einer statischen Variable. Der genaue Wert davon ist aber erst zur Laufzeit bekannt. Die Instanzen der Klasse brauchen einen vernünftig initialisierten Wert, um ihre Aufgabe zu erfüllen. Ungefähr so:</p>
<pre><code class="language-cpp">class foo{
private:
  static komplizierter_datentyp static_variable;
public:
  void leg_los()
  {
    // Benötigt static_variable
  }
  static void init(/*Parameter*/)
  {
    // Initialisiert static_variable;
  }
};
</code></pre>
<p>Kann man den Benutzer der Klasse irgendwie dazu zwingen, die init-Methode vor dem ersten leg_los() aufzurufen? Vorzugsweise mit Fehlermeldung zur Compilezeit? Ein assert zur Laufzeit wäre nur insofern hilfreich, als das es eine genauere Fehleranalyse erlaubt. Das Programm wird nämlich höchstwahrscheinlich ohnehin an der Stelle abstürzen, wenn ein uninitialisierter Wert benutzt wird.</p>
<p>Die beste Möglichkeit, die mir dazu einfällt, wäre ein Auslagern der Variable:</p>
<pre><code class="language-cpp">class foo{
public:
  void leg_los(komplizierter_datentyp &amp;parameter)
  {
    // Benutzt Parameter
  }
};
</code></pre>
<p>Dies stellt sicher, dass der benötigte Parameter initialisiert ist, da man die Funktion ohne gar nicht aufrufen könnte. aber kleiner Nachteil: Jetzt muss man sich als Benutzer um mehr kümmern. Im schlimmsten Fall muss man das ehemalige statische Objekt nun im ganzen Programm rumreichen oder gleich global machen. Das ist zwar erstmal Problem des Nutzers, dennoch finde ich dies unschön (vor allem da dieser Benutzer erstmal ich selbst bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).<br />
Es ist auch von der Modellierung nur halbschön, denn die statische Eigenschaft habe ich da anfangs nicht hingesetzt weil es den Code kürzer macht, sondern weil es sich auch vom Modell her um eine gemeinsame Eigenschaft aller Instanzen dieser Klasse handelt.</p>
<p>Gibt's da bessere Alternativen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933612</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 29 Jul 2010 14:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:00:12 GMT]]></title><description><![CDATA[<p>Also ich mache so was so, das ich dann halt die Init-Methode in der anderen Methode explizit aufrufe. Damit das aber nicht unnötig passiert, merke ich mir, ob ich es schon aufgerufen habe. Bsp.:</p>
<pre><code class="language-cpp">class foo{
private:
  static komplizierter_datentyp static_variable;
  static bool initilized;
public:
  void leg_los()
  {
    init();
    // Benötigt static_variable
  }
  static void init(/*Parameter*/)
  {
    if(initilized)
      return;
    // Initialisiert static_variable;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1933613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933613</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:00:40 GMT]]></title><description><![CDATA[<p>Warum nicht so? Immer diese kompliziert denkenden C++ler... <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>
<pre><code class="language-cpp">private:
    static komplizierter_datentyp&amp; init()
    {
        static komplizierter_datentyp var = ...;
        return var;
    }

public:
    void leg_los()
    {
        verwende(init());
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1933614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933614</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:00:40 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:03:28 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kann man den Benutzer der Klasse irgendwie dazu zwingen, die init-Methode vor dem ersten leg_los() aufzurufen? Vorzugsweise mit Fehlermeldung zur Compilezeit?</p>
</blockquote>
<p>Ich glaub kaum, dass der Compiler immer die Aufrufreihenfolge herrausfinden kann, ich denke sogar das ist unmöglich.</p>
<p>Das kommentierte /*Parameter*/ soll bedeuten, dass init schon Parameter braucht, aber leg_los nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933617</guid><dc:creator><![CDATA[xxxxxxxxxxxxxxxx]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:10:08 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum nicht so?</p>
<pre><code class="language-cpp">private:
    static komplizierter_datentyp&amp; init()
    {
        static komplizierter_datentyp var = ...;
        return var;
    }

public:
    void leg_los()
    {
        verwende(init());
    }
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>...wobei die statische Funktion nicht unbedingt inline sein muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933621</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:24:45 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Warum nicht so?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Gefällt mir ebenfalls. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Hast recht mit dem kompliziert denken.</p>
<p>Das mit dem /*Parameter*/ heißt, dass es Parameter geben könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933632</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:33:26 GMT]]></title><description><![CDATA[<p>Gut, dass es euch gefällt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>...wobei die statische Funktion nicht unbedingt inline sein muss...</p>
</blockquote>
<p>Ja, war mehr der Einfachheit halber. Ausser bei Templates habe ich eigentlich nie Inline-Methoden, und selbst da halte ich die Definition oft von der Deklaration getrennt.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Hast recht mit dem kompliziert denken.</p>
</blockquote>
<p>Glaub mir, das passiert mir selbst oft genug. <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>Kürzlich hatte ich zwei relativ ähnliche Klassen, für die ich Code in ein separates (CRTP-)Template auslagern wollte, um Codeduplikation zu vermeiden. Das artete schnell in eine Template-Orgie mit etlichen Parametern aus, sodass ich nachher doppelt so viel Code hatte und merkte, dass doch nicht alles so einheitlich geht. Naja, inzwischen dupliziere ich halt ein paar Zeilen Code. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933637</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Thu, 29 Jul 2010 15:36:58 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das mit dem /*Parameter*/ heißt, dass es Parameter geben könnte.</p>
</blockquote>
<p>Wenn es Parameter gibt, aber leg_los keine hat, dann ist das von Nexus auch nicht toll bzw. geht nicht. Da würde ich deine erste Variante verwenden und ein assert in leg_los.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933639</guid><dc:creator><![CDATA[xxxxxxxxxxxxxxxx]]></dc:creator><pubDate>Thu, 29 Jul 2010 15:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Fri, 30 Jul 2010 11:42:49 GMT]]></title><description><![CDATA[<p>Da das mit den Parametern echt nicht gut zu Nexus Vorschlag passte, habe ich mir jetzt folgendes gedacht:</p>
<pre><code class="language-cpp">class komplexer_datentyp
{
 public:
   komplexer_datentyp(/*Parameter*/);
   leg_los(foo&amp; f);
};
</code></pre>
<p>Das stellt sicher, dass die statischen Daten existieren, da man ein Objekt davon braucht um leg_los überhaupt aufrufen zu können. Ist zwar nicht viel anders als die Lösung die ich zuerst hatte, aber flexibler und passt (in meinem Fall) besser zum Modell. Wie gesagt sind foo und komplexer_datentyp ohnehin modelltechnisch eng zusammengehörig. Die Trennung ob komplexer_datentyp eine Eigenschaft von foo ist oder ob komplexer_datentyp weiß wie man ein foo loslegen lässt ist da nicht eindeutig beantwortbar, daher kann ich die technisch einfachere Lösung wählen.</p>
<p>Man könnte sogar beides mischen, indem man komplexer_datentyp::leg_los() einfach f.leg_los() mit this als Parameter aufrufen lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1933988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1933988</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 30 Jul 2010 11:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Fri, 30 Jul 2010 21:31:18 GMT]]></title><description><![CDATA[<p>wie wäre es mit einem static_assert? <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/1934256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934256</guid><dc:creator><![CDATA[123454312]]></dc:creator><pubDate>Fri, 30 Jul 2010 21:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Alternative für Init-Methode (Antwort ist nicht der Konstruktor!) on Fri, 30 Jul 2010 21:36:02 GMT]]></title><description><![CDATA[<p>123454312 schrieb:</p>
<blockquote>
<p>wie wäre es mit einem static_assert? <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>
</blockquote>
<p>Gerne, aber wie? Ich glaube nicht, dass das in diesem Fall geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934258</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 30 Jul 2010 21:36:02 GMT</pubDate></item></channel></rss>