<?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[Verständnisproblem: Static Variabeln]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine Basisklasse, von der verschiedene Unterklassen erben, nun möchte ich in diesen Unterklassen jeweist eine static Variable haben, dass heisst die Variable sollte in jeder Unterklasse static sein und jede Unterklasse hat einen anderen Wert in dieser static variable gespeichert.</p>
<p>Natürlich kann ich das so machen, dass ich in jeder Unterklasse diese static variable deklariere, doch geht das auch irgendwie besser? (Das ganze in der Basisklasse deklarieren??)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258324/verständnisproblem-static-variabeln</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 10:35:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258324.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jan 2010 11:29:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 11:29:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine Basisklasse, von der verschiedene Unterklassen erben, nun möchte ich in diesen Unterklassen jeweist eine static Variable haben, dass heisst die Variable sollte in jeder Unterklasse static sein und jede Unterklasse hat einen anderen Wert in dieser static variable gespeichert.</p>
<p>Natürlich kann ich das so machen, dass ich in jeder Unterklasse diese static variable deklariere, doch geht das auch irgendwie besser? (Das ganze in der Basisklasse deklarieren??)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835507</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Sat, 09 Jan 2010 11:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 12:02:03 GMT]]></title><description><![CDATA[<p>Wenn ich dich richtig verstanden habe, dann suchst du das &quot;Curiously recurring template pattern&quot;:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class Base
{
  protected:
  static int&amp; foo(){static int foo=0; return foo;}
};

class Derived1: public Base&lt;Derived1&gt;
{
};

class Derived2: public Base&lt;Derived2&gt;
{
};
</code></pre>
<p>Ich hoffe ich hab's jetzt aus dem Kopf richtig hinbekommen. Bis auf eventuelle Syntaxfehler sollte das Schema aber stimmen.</p>
<p>du kannst natürlich die static-Variablen auf klassische Weise ohne Funktion anlegen, ich finde diese Methode aber schöner. Wichtig ist nur die Konstruktion mit dem Template und der Vererbung. Willst du die Variablen an Subsubklassen weitervererben, dann machst du die Subklassen einfach auch zu Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835521</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 12:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 13:09:25 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort!</p>
<p>Am Besten mache ich mal ein Beispiel, wie ich das ganze meine:</p>
<pre><code class="language-cpp">class Vogel {
  public:
    char GetGesang() { return m_gesang; }
  protected:
    char m_gesang;
};

class Spatz : public Vogel {
  public:
    static char m_gesang;
};

char Spatz::m_gesang = 'G';

int main() {
  Spatz spatz = new Spatz();
  spatz-&gt;GetGesang(); // Sollte 'G' sein
  return 0;
}
</code></pre>
<p>Jeder meiner Vögel hat einen anderen Gesang, der durch eine Char Variable definiert wird. Ich möchte mit spatz-&gt;Gesang() zu 'G' kommen, jedoch sollte m_gesang in Spatz statisch sein, da jeder Spatz den gleichen Gesangstyp hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835540</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Sat, 09 Jan 2010 13:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 13:31:20 GMT]]></title><description><![CDATA[<p>Dann habe ich dich richtig verstanden und meine Antwort passte:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Vogel {
  public:
    char GetGesang() { return m_gesang; }
    static char m_gesang;
};

class Spatz : public Vogel&lt;Spatz&gt; {
};

class Taube : public Vogel&lt;Taube&gt; {
};

template &lt;class T&gt; char Vogel&lt;T&gt;::m_gesang = '\0';

int main() {
  Spatz::m_gesang='G';
  Taube::m_gesang='H';
  Spatz spatz1,spatz2;
  Taube taube;
  cout&lt;&lt;spatz1.GetGesang()&lt;&lt;spatz2.GetGesang()&lt;&lt;taube.GetGesang()&lt;&lt;endl; // GGH
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1835559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835559</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 13:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 13:42:23 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann habe ich dich richtig verstanden und meine Antwort passte:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Vogel {
  public:
    char GetGesang() { return m_gesang; }
    static char m_gesang;
};

class Spatz : public Vogel&lt;Spatz&gt; {
};

class Taube : public Vogel&lt;Taube&gt; {
};

template &lt;class T&gt; char Vogel&lt;T&gt;::m_gesang = '\0';

int main() {
  Spatz::m_gesang='G';
  Taube::m_gesang='H';
  Spatz spatz1,spatz2;
  Taube taube;
  cout&lt;&lt;spatz1.GetGesang()&lt;&lt;spatz2.GetGesang()&lt;&lt;taube.GetGesang()&lt;&lt;endl; // GGH
  return 0;
}
</code></pre>
</blockquote>
<p>Danke für deine Antwort, das funktioniert super...</p>
<p>Jedoch verstehe ich es nicht, könntest du bitte eine kurze Erläuterung machen? (Nur falls du Zeit hast natürlich :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835566</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Sat, 09 Jan 2010 13:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 13:45:52 GMT]]></title><description><![CDATA[<p>Samyboy schrieb:</p>
<blockquote>
<p>Jedoch verstehe ich es nicht, könntest du bitte eine kurze Erläuterung machen? (Nur falls du Zeit hast natürlich :D)</p>
</blockquote>
<p>Zeit hätte ich wohl, aber kannst du genauer fragen, was du nicht verstehst? Hast du Erfahrung mit Templates?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835568</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 13:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 13:49:45 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Samyboy schrieb:</p>
<blockquote>
<p>Jedoch verstehe ich es nicht, könntest du bitte eine kurze Erläuterung machen? (Nur falls du Zeit hast natürlich :D)</p>
</blockquote>
<p>Zeit hätte ich wohl, aber kannst du genauer fragen, was du nicht verstehst? Hast du Erfahrung mit Templates?</p>
</blockquote>
<p>Ja, ich habe Template 1 oder 2 Mal verwendet, aber nur um zum Beispiel mehrere Typen von Argumente an eine Funktion übergeben zu können. (double, int, float etc.)</p>
<p>Was ich nicht verstehe ist:</p>
<p>Was macht das template&lt;class T&gt; ganz oben neben der Klasse?<br />
Wieso sieht die Vererbung so aus: Taube : public Vogel&lt;Taube&gt;<br />
Setzt diese Zeile: template &lt;class T&gt; char Vogel&lt;T&gt;::m_gesang = '\0'; alle m_gesang zu '\0'?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835573</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Sat, 09 Jan 2010 13:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 14:15:30 GMT]]></title><description><![CDATA[<p>Also: Ein Template ist im wortwörtlichen Sinne eine Schablone für eine Klasse. Es ist wichtig, dass es noch keine vollständige Klasse ist. Komplett wird sie erst, wenn man sie instanziert, das heiß wenn man sie irgendwo mitsamt eines Parameters benutzt. Dann wird aus der Schablone eine Klasse für eben diesen Parameter erzeugt.</p>
<p>Folgendes ist die Schablone für einen Vogel:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Vogel {
  public:
    char GetGesang() { return m_gesang; }
    static char m_gesang;
};
</code></pre>
<p>Man kann nun leicht verschiedene Klassen machen:</p>
<pre><code class="language-cpp">Vogel&lt;int&gt; vi;
Vogel&lt;char&gt; vc;
Vogel&lt;string&gt; vs;
</code></pre>
<p>Wichtig ist, das sind alles ganz verschiedene Klassen, die gar nichts miteinander zu tun haben.</p>
<p>Da die obige Schablone eine static Variable enthält, muss dieser bekanntlich irgendwo Speicherplatz zugewiesen werden, wie man das von static Variablen kennt:</p>
<pre><code class="language-cpp">template &lt;class T&gt; char Vogel&lt;T&gt;::m_gesang='\0';
</code></pre>
<p>Das ist wieder eine Schablone. Wenn man das Template instanziert, dann haben die verschiedenen Instanzen für unterschiedliche Parameter nichts miteinander zu tun.</p>
<p>(Das setzen auf 0 ist hierbei bedeutungslos, ich wollte der Variable nur einen Anfangswert zuweisen. Kann man auch weglassen)</p>
<p>Gucken wir jetzt mal die abgeleiteten Klassen an:</p>
<pre><code class="language-cpp">class Spatz : public Vogel&lt;Spatz&gt; {
};

class Taube : public Vogel&lt;Taube&gt; {
};
</code></pre>
<p>Diese beiden Klassen instanzieren das Vogel-Template. Da sie beide unterschiedliche Parameter für das Template verwenden, erben sie dabei von zwei ganz verschiedenen Klassen. Spatz erbt von Vogel&lt;Spatz&gt; und Taube erbt von Vogel&lt;Taube&gt;. Vogel&lt;Spatz&gt; und Vogel&lt;Taube&gt; sind wie schon gesagt, richtige Klassen die aber nicht miteinander zu tun haben. Beide enthalten aber eine static Variable 'm_gesang' die dann von Spatz und Taube geerbt wird. Und da es wie gesagt unterschiedliche Klassen sind, von denen geerbt wird, sind auch die geerbten static Variablen in Spatz und Taube verschieden (haben aber den gleichen Namen).</p>
<p>Warum habe ich so geerbt?:</p>
<pre><code class="language-cpp">Taube : public Vogel&lt;Taube&gt;
</code></pre>
<p>Dabei geht es nur darum, dass ein einzigartiger Templateparameter zur Instanzierung von Vogel genutzt wird. Ich hätte auch folgendes machen können:</p>
<pre><code class="language-cpp">class Spatz : public Vogel&lt;char&gt; {
};

class Taube : public Vogel&lt;int&gt; {
};
</code></pre>
<p>Das hätte auch funktioniert. Aber irgendwann wären mir die Namen für unterschiedliche Typen ausgegangen, darum liegt es nahe, den Klassennamen selbst als Templateparameter zu benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835585</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 14:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 14:44:25 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Also: Ein Template ist im wortwörtlichen Sinne eine Schablone für eine Klasse. Es ist wichtig, dass es noch keine vollständige Klasse ist. Komplett wird sie erst, wenn man sie instanziert, das heiß wenn man sie irgendwo mitsamt eines Parameters benutzt. Dann wird aus der Schablone eine Klasse für eben diesen Parameter erzeugt.</p>
<p>Folgendes ist die Schablone für einen Vogel:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Vogel {
  public:
    char GetGesang() { return m_gesang; }
    static char m_gesang;
};
</code></pre>
<p>Man kann nun leicht verschiedene Klassen machen:</p>
<pre><code class="language-cpp">Vogel&lt;int&gt; vi;
Vogel&lt;char&gt; vc;
Vogel&lt;string&gt; vs;
</code></pre>
<p>Wichtig ist, das sind alles ganz verschiedene Klassen, die gar nichts miteinander zu tun haben.</p>
<p>Da die obige Schablone eine static Variable enthält, muss dieser bekanntlich irgendwo Speicherplatz zugewiesen werden, wie man das von static Variablen kennt:</p>
<pre><code class="language-cpp">template &lt;class T&gt; char Vogel&lt;T&gt;::m_gesang='\0';
</code></pre>
<p>Das ist wieder eine Schablone. Wenn man das Template instanziert, dann haben die verschiedenen Instanzen für unterschiedliche Parameter nichts miteinander zu tun.</p>
<p>(Das setzen auf 0 ist hierbei bedeutungslos, ich wollte der Variable nur einen Anfangswert zuweisen. Kann man auch weglassen)</p>
<p>Gucken wir jetzt mal die abgeleiteten Klassen an:</p>
<pre><code class="language-cpp">class Spatz : public Vogel&lt;Spatz&gt; {
};

class Taube : public Vogel&lt;Taube&gt; {
};
</code></pre>
<p>Diese beiden Klassen instanzieren das Vogel-Template. Da sie beide unterschiedliche Parameter für das Template verwenden, erben sie dabei von zwei ganz verschiedenen Klassen. Spatz erbt von Vogel&lt;Spatz&gt; und Taube erbt von Vogel&lt;Taube&gt;. Vogel&lt;Spatz&gt; und Vogel&lt;Taube&gt; sind wie schon gesagt, richtige Klassen die aber nicht miteinander zu tun haben. Beide enthalten aber eine static Variable 'm_gesang' die dann von Spatz und Taube geerbt wird. Und da es wie gesagt unterschiedliche Klassen sind, von denen geerbt wird, sind auch die geerbten static Variablen in Spatz und Taube verschieden (haben aber den gleichen Namen).</p>
<p>Warum habe ich so geerbt?:</p>
<pre><code class="language-cpp">Taube : public Vogel&lt;Taube&gt;
</code></pre>
<p>Dabei geht es nur darum, dass ein einzigartiger Templateparameter zur Instanzierung von Vogel genutzt wird. Ich hätte auch folgendes machen können:</p>
<pre><code class="language-cpp">class Spatz : public Vogel&lt;char&gt; {
};

class Taube : public Vogel&lt;int&gt; {
};
</code></pre>
<p>Das hätte auch funktioniert. Aber irgendwann wären mir die Namen für unterschiedliche Typen ausgegangen, darum liegt es nahe, den Klassennamen selbst als Templateparameter zu benutzen.</p>
</blockquote>
<p>Ich danke dir viel mal für deine Erläuterung!</p>
<p>Du hast mir echt viel geholfen und mich weitergebracht <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="😃"
    /></p>
<p>Eine Frage hätte ich dann noch, sollte man das tun? Wie effizient ist das?<br />
Denn für alle meine Unterklassen wird ja dann eine neue Basisklasse erstellt und das scheint mir ineffizient zu sein (hab aber keinen Plan von solchen Dingen) <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835595</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Sat, 09 Jan 2010 14:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 17:35:26 GMT]]></title><description><![CDATA[<p>Klassen sind bloß Abstrakte Gebilde. Abstraktion kostet gar nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835738</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 17:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 18:01:57 GMT]]></title><description><![CDATA[<p>Dazu sollte noch gesagt werden, dass Spatz und Taube nun unterschieldiche Basisklassen haben und so nicht mehr polymorph über einen Vogel* angesprochen werden können, falls du sowas vorhattest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835788</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 09 Jan 2010 18:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Static Variabeln on Sat, 09 Jan 2010 19:00:28 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Dazu sollte noch gesagt werden, dass Spatz und Taube nun unterschieldiche Basisklassen haben und so nicht mehr polymorph über einen Vogel* angesprochen werden können, falls du sowas vorhattest.</p>
</blockquote>
<p>Stimmt. Man könnte aber natürlich noch eine Klasse machen von der der Vogel erbt, dann geht das auch:</p>
<pre><code class="language-cpp">class Vogel{
public:
  virtual char GetGesang()=0;
};

template&lt;class T&gt; class Hilfsklasse: public Vogel {
public:
  static char m_gesang;
  virtual char GetGesang(){return m_gesang;}
};

class Spatz : public Hilfsklasse&lt;Spatz&gt; {
};

class Taube : public Hilfsklasse&lt;Taube&gt; {
};

template &lt;class T&gt; char Hilfsklasse&lt;T&gt;::m_gesang='\0';

int main() {
  Spatz::m_gesang='G';
  Taube::m_gesang='H';

  Vogel *voegel[2];
  voegel[0]=new Spatz();
  voegel[1]=new Taube();
  cout&lt;&lt;voegel[0]-&gt;GetGesang()&lt;&lt;voegel[1]-&gt;GetGesang()&lt;&lt;endl; // GH
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1835853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835853</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Jan 2010 19:00:28 GMT</pubDate></item></channel></rss>