<?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[Defaultwerte für Instanzattribute]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wenn ich einem als Instanzattribut deklarierten Array eine <em>Defaultbelegung</em> geben will, bevor der Verwender des Objekts über öffentliche Methoden den Array manipuliert: Habe ich dann die Möglichkeit, mit der {...} Notation die Array-Elemente in einer einzigen Anweisung zuzuweisen? Oder muss ich es wie im unten stehenden Code machen?</p>
<p>Gruss,<br />
Rüdiger</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;

class X {
  public : 
    X();   
// Irgendwelche Beispielmethoden:
    void wizzle(double* a);          
  private :  
    const static size_t SIZE = 6; 
// Hier habe ich als nichtstatisches Member einen Array fester Grösse mit double-Werten         
    double _a[SIZE];
// Eigentlich würde ich gern gleich den Default setzen
// Aber das ist mir nicht erlaubt, man soll das im Konstruktor machen (warum?)
//    double _a[SIZE] = {17.,22.,34.,18.,23.,35.};     
  };      

X::X() {

// Also gut, mache ich es also im Konstruktor, wenn es unbedingt so sein soll

// Aber das folgende ist mir leider auch nicht erlaubt
//  _a = {17.,22.,34.,18.,23.,35.};     

// So muss ich die Defaultbelegung mit hässlichen Einzelwertzuweisungen ausschreiben
// Muss das wirklich so sein? Im 21. Jahrhundert?
  _a[0] = 17.;
  _a[1] = 22.;
  _a[2] = 34.;    
  _a[3] = 18.;
  _a[4] = 23.;
  _a[5] = 35.;    
  }       

void X::wizzle(double *a ) {
  size_t i = 0;
// Macht irgendwelche Sachen mit dem Objekt, ändert oder setzt z.B. den Array     
  for (i=0;i&lt;SIZE;i++) _a[i] = a[i];
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/258991/defaultwerte-für-instanzattribute</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 01:22:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258991.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jan 2010 22:42:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Defaultwerte für Instanzattribute on Sun, 17 Jan 2010 22:42:21 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wenn ich einem als Instanzattribut deklarierten Array eine <em>Defaultbelegung</em> geben will, bevor der Verwender des Objekts über öffentliche Methoden den Array manipuliert: Habe ich dann die Möglichkeit, mit der {...} Notation die Array-Elemente in einer einzigen Anweisung zuzuweisen? Oder muss ich es wie im unten stehenden Code machen?</p>
<p>Gruss,<br />
Rüdiger</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;

class X {
  public : 
    X();   
// Irgendwelche Beispielmethoden:
    void wizzle(double* a);          
  private :  
    const static size_t SIZE = 6; 
// Hier habe ich als nichtstatisches Member einen Array fester Grösse mit double-Werten         
    double _a[SIZE];
// Eigentlich würde ich gern gleich den Default setzen
// Aber das ist mir nicht erlaubt, man soll das im Konstruktor machen (warum?)
//    double _a[SIZE] = {17.,22.,34.,18.,23.,35.};     
  };      

X::X() {

// Also gut, mache ich es also im Konstruktor, wenn es unbedingt so sein soll

// Aber das folgende ist mir leider auch nicht erlaubt
//  _a = {17.,22.,34.,18.,23.,35.};     

// So muss ich die Defaultbelegung mit hässlichen Einzelwertzuweisungen ausschreiben
// Muss das wirklich so sein? Im 21. Jahrhundert?
  _a[0] = 17.;
  _a[1] = 22.;
  _a[2] = 34.;    
  _a[3] = 18.;
  _a[4] = 23.;
  _a[5] = 35.;    
  }       

void X::wizzle(double *a ) {
  size_t i = 0;
// Macht irgendwelche Sachen mit dem Objekt, ändert oder setzt z.B. den Array     
  for (i=0;i&lt;SIZE;i++) _a[i] = a[i];
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1840503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840503</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Sun, 17 Jan 2010 22:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultwerte für Instanzattribute on Sun, 17 Jan 2010 23:01:41 GMT]]></title><description><![CDATA[<p>Rüdiger Plantiko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Muss das wirklich so sein? Im 21. Jahrhundert?
  _a[0] = 17.;
  _a[1] = 22.;
  _a[2] = 34.;    
  _a[3] = 18.;
  _a[4] = 23.;
  _a[5] = 35.;
</code></pre>
</blockquote>
<p>Nein, es gibt da ein paar Alternativen.</p>
<pre><code class="language-cpp">// 1: temporäres Array und kopieren
X::X()
{
   double temp[SIZE] = {17.,22.,34.,18.,23.,35.};
   std::copy(temp, temp+SIZE, _a);
}
</code></pre>
<pre><code class="language-cpp">// 2: Nicht mühsame und unpraktische Arrays aus C verwenden, sondern
// moderne Container. std::tr1::array verhält sich bezüglich Speicher und 
// Geschwindigkeit genau wie ein Array, bietet aber mehr Komfort und
// Sicherheit im Debug-Modus. Es kann zum Beispiel direkt in der
// Initialisierungsliste des Konstruktors initialisiert werden.
#include &lt;array&gt; // evtl. auch &lt;tr1/array&gt;

// Lokale Funktion, die den Initialwert liefert. Durch RVO-
// Optimierung wahrscheinlich keine unnötige Kopie notwendig
std::tr1::array&lt;double, SIZE&gt; create_array()
{
    std::tr1::array&lt;double, SIZE&gt; array = {17.,22.,34.,18.,23.,35.};
    return array;
}

X::X()
// _a ist als std::tr1::array&lt;double, SIZE&gt; deklariert
: _a(create_array())
{
}
</code></pre>
<pre><code class="language-cpp">// 3. Boost und Container verwenden
#include &lt;boost/assign/list_of.hpp&gt;

X::X()
// _a ist als std::vector&lt;double&gt; deklariert
: _a(boost::assign::list_of(17.)(22.)(34.)(18.)(23.)(35.))
{
}
</code></pre>
<p>Ich weiss, das sind alles mehr Workarounds. Im neuen C++-Standard wird es Initialisierungslisten für benutzerdefinierte Typen geben, ausserdem können dann Arrays im Konstruktor initialisiert werden.</p>
<p>Allerdings halte ich persönlich eh nicht sehr viel von Arrays und verwende meist std::tr1::array oder die STL-Container. Es kommt bei mir auch nicht sehr häufig vor, dass ich ein Array mit hardgecodeten Zahlen fülle. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1840515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840515</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 17 Jan 2010 23:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultwerte für Instanzattribute on Mon, 18 Jan 2010 08:37:51 GMT]]></title><description><![CDATA[<p>Hallo Nexus,</p>
<p>danke für die rasche Antwort zu nachtschlafender Stunde <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>
<blockquote>
<p>Ich weiss, das sind alles mehr Workarounds.</p>
</blockquote>
<p>Trotzdem danke für das Aufzeigen dieser Alternativen.</p>
<blockquote>
<p>Im neuen C++-Standard wird es Initialisierungslisten für benutzerdefinierte Typen geben, ausserdem können dann Arrays im Konstruktor initialisiert werden.</p>
</blockquote>
<p>Das wäre zu wünschen. Wenn ich ja einen temporären Array mit einem Aggregat-Initialisierer definieren und diesen dann in die gewünschte Membervariable kopieren darf,</p>
<pre><code class="language-cpp">double temp[SIZE] = {1.,2.,3.,4.,5.,6.};
std::copy(temp, temp+SIZE, _a);
</code></pre>
<p>dann spricht schliesslich nichts dagegen, dass der Compiler diese Anweisungen für mich generiert, indem ich nur noch schreiben muss</p>
<pre><code class="language-cpp">_a = {1.,2.,3.,4.,5.,6.};
</code></pre>
<p>Alles andere ist unnützes Sprach-Rauschen, das nur die Lesbarkeit des Wesentlichen behindert und daher aus dem Quellcode eliminiert werden sollte.</p>
<blockquote>
<p>Allerdings halte ich persönlich eh nicht sehr viel von Arrays und verwende meist std::tr1::array oder die STL-Container.</p>
</blockquote>
<p>Ich verwende den std::vector, wenn ich Arrays variabler Grösse brauche. Für Arrays fester Grösse bin ich aber bislang mit den &quot;Vanilla&quot; C Arrays vollauf zufrieden.</p>
<blockquote>
<p>Es kommt bei mir auch nicht sehr häufig vor, dass ich ein Array mit hardgecodeten Zahlen fülle. <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>
</blockquote>
<p>Verwendest Du in Deinem Code nie konstante Werte? Ich schon, meistens wenigstens als Defaults. Und manchmal eben auch Listen von konstanten Werten...</p>
<p>Gruss,<br />
Rüdiger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840601</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Mon, 18 Jan 2010 08:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultwerte für Instanzattribute on Mon, 18 Jan 2010 09:29:43 GMT]]></title><description><![CDATA[<p>Rüdiger Plantiko schrieb:</p>
<blockquote>
<p>Verwendest Du in Deinem Code nie konstante Werte? Ich schon, meistens wenigstens als Defaults. Und manchmal eben auch Listen von konstanten Werten...</p>
</blockquote>
<p>Die Frage, welche ich mir da stellen würde:<br />
Brauchst du wirklich ein Array von konstanter Grösse oder sind es nicht eher (z.B.) 6 unterschiedliche Werte, welche man eigentlich besser in 6 unterschiedliche Variablen aufgeteilt hätte, damit man gleich sprechende Namen für die Werte hat?</p>
<p>Mir käme nämlich kein aktuelles Beispiel in den Sinn, wo ich sowas benötigt hätte und du redest davon, als wäre dies noch ziemlich üblich für dich <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840624</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 18 Jan 2010 09:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultwerte für Instanzattribute on Mon, 18 Jan 2010 13:45:54 GMT]]></title><description><![CDATA[<p>Hallo Dravere</p>
<blockquote>
<p>Brauchst du wirklich ein Array von konstanter Grösse oder sind es nicht eher (z.B.) 6 unterschiedliche Werte, welche man eigentlich besser in 6 unterschiedliche Variablen aufgeteilt hätte, damit man gleich sprechende Namen für die Werte hat?</p>
</blockquote>
<p>Na, es gibt doch Fälle, wo man eine feste Anzahl von Kästchen (Plätzen, Töpfchen) hat und diese mit Werten belegt haben will, wenn es der User nicht tut. Man kann ja den std::array auch mit Werten vorbelegen. Wenn ich z.B. schreibe</p>
<pre><code class="language-cpp">_a.assign(17.);
</code></pre>
<p>dann werden alle Plätze des Arrays mit der Zahl 17 vorbelegt. Jetzt will ich aber nicht lauter gleiche Werte, sondern z.B. die Vorbelegung mit den Werten 3., 2., 1., 3., 2., 1., ... Dieselbe Rechtfertigung, die es für <code>assign()</code> gibt, würde auch für eine solche Initialisierungswunsch gelten.</p>
<p>Wo Du explizit danach fragst, kann ich Dir mein Beispiel schon sagen: Es ist eine astrologische Anwendung. In der Astrologie wird der Tierkreis nicht nur in die zwölf Tierkreiszeichen, sondern auch, beginnend mit dem Aszendenten, in zwölf ungleich grosse Abschnitte, die sogenannten Häuser, geteilt. Jedem Haus wird eine besondere Wertigkeit (Stärke) zugeordnet. Aber jeder Astrologe hat andere Wahlen für die Wertigkeiten dieser Häuser.</p>
<p>Daher bietet meine DLL eine API-Funktion an, mit der diese Werte explizit gesetzt werden können. Wenn jedoch keine Werte gesetzt wurden, müssen bestimmte fest verdrahtete Defaultwerte greifen. Und hierzu verwende ich meinen &quot;konstanten&quot; Array, der wegen C++ leider nicht so konstant sein kann, wie ich das gerne hätte.</p>
<p><a href="http://astropatterns.cvs.sourceforge.net/viewvc/astropatterns/astropatterns/MundanePositions.cpp?revision=1.5&amp;view=markup" rel="nofollow">http://astropatterns.cvs.sourceforge.net/viewvc/astropatterns/astropatterns/MundanePositions.cpp?revision=1.5&amp;view=markup</a></p>
<p>Gruss,<br />
Rüdiger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840741</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Mon, 18 Jan 2010 13:45:54 GMT</pubDate></item></channel></rss>