<?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[static Member Variable geht irgendwie nicht]]></title><description><![CDATA[<p>Hallo,</p>
<p>In einem etwas umfangreicheren Programm kaempfe ich gerade mit etwas, das mir eigentlich zunaechst simpler erschien, aber ich bekomme es nicht wirklich hin. Ich habe die Situation hier mit Laien-variablen nachgestellt.</p>
<p>Wenn ich das ganze kompiliere (G++ 4.3.2 / Debian) bekomme ich einen Linker Error. Wie macht man, dass der Code unten compiliert? Was mach ich falsch bzw. warum geht's net? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class BaseGroove
{
public:
  BaseGroove(int arg){ std::cout &lt;&lt; &quot;BaseGroove::BaseGroove( &quot; &lt;&lt; arg &lt;&lt; &quot; ) - ctor\n&quot;; }
  void doGroove(){ std::cout &lt;&lt; &quot;BaseGroove::doGroove()\n&quot;; }
};

#define ARGUMENT 777

class BattleField
{
private:
  struct MyGroove : public BaseGroove
  {
    MyGroove() 
      : BaseGroove( ARGUMENT){ std::cout &lt;&lt; &quot;MyGroove::MyGroove()\n&quot;; }
  };

  typedef struct MyGroove
    Groovy_t;

  static Groovy_t groovy;

public:
  static void getStatic()
  {
    std::cout &lt;&lt; &quot;BattleField::getStatic()\n&quot;;

    // problem: ...undefined reference to 'Battlefield::groovy'
    groovy.doGroove();
  }
};

int main(){
  BattleField::getStatic();
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/228420/static-member-variable-geht-irgendwie-nicht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 14:54:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228420.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Nov 2008 21:13:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Thu, 27 Nov 2008 21:13:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>In einem etwas umfangreicheren Programm kaempfe ich gerade mit etwas, das mir eigentlich zunaechst simpler erschien, aber ich bekomme es nicht wirklich hin. Ich habe die Situation hier mit Laien-variablen nachgestellt.</p>
<p>Wenn ich das ganze kompiliere (G++ 4.3.2 / Debian) bekomme ich einen Linker Error. Wie macht man, dass der Code unten compiliert? Was mach ich falsch bzw. warum geht's net? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class BaseGroove
{
public:
  BaseGroove(int arg){ std::cout &lt;&lt; &quot;BaseGroove::BaseGroove( &quot; &lt;&lt; arg &lt;&lt; &quot; ) - ctor\n&quot;; }
  void doGroove(){ std::cout &lt;&lt; &quot;BaseGroove::doGroove()\n&quot;; }
};

#define ARGUMENT 777

class BattleField
{
private:
  struct MyGroove : public BaseGroove
  {
    MyGroove() 
      : BaseGroove( ARGUMENT){ std::cout &lt;&lt; &quot;MyGroove::MyGroove()\n&quot;; }
  };

  typedef struct MyGroove
    Groovy_t;

  static Groovy_t groovy;

public:
  static void getStatic()
  {
    std::cout &lt;&lt; &quot;BattleField::getStatic()\n&quot;;

    // problem: ...undefined reference to 'Battlefield::groovy'
    groovy.doGroove();
  }
};

int main(){
  BattleField::getStatic();
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1622160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622160</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:13:40 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Thu, 27 Nov 2008 21:16:09 GMT]]></title><description><![CDATA[<p>Statische Membervariablen müssen ausserhalb der Klasse definiert werden. Du kannst sie auch gleich dort initialisieren, musst aber nicht.</p>
<pre><code class="language-cpp">BattleField::Groovy_t groovy;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1622163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622163</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Thu, 27 Nov 2008 21:21:13 GMT]]></title><description><![CDATA[<p>außerdem musst du sie im cpp-File (nicht im header) anlegen (siehe Nexus' post), da du sonst Linkerfehler wegen mehrfach definierten symbolen bekommst, wenn du den header in mehr als einer cpp einbinden möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622166</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Thu, 27 Nov 2008 21:44:10 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>außerdem musst du sie im cpp-File (nicht im header) anlegen (siehe Nexus' post), da du sonst Linkerfehler wegen mehrfach definierten symbolen bekommst, wenn du den header in mehr als einer cpp einbinden möchtest.</p>
</blockquote>
<p>Hmm.. verstehe das Problem jetzt nicht ganz, wenn ich es in den Header schreibe<br />
und einen Inlcude Guard benutze, dann wird die static Variable doch auch nur<br />
einmal definiert?! Ausserdem habe ich im Bsp, zB nur ein File .cpp</p>
<p>Ich habe nun erfolglos ausprobiert vor und nach der Klasse BattleField die<br />
folgende Zeile einzufuegen (hatte ich vorher auch schon, eben auch erfolglos)</p>
<pre><code class="language-cpp">static struct BattleField::Groovy_t groovy;
</code></pre>
<p>Nebenbei habe ich ausprobiert, die Definition vom &quot;MyGroove&quot; statt &quot;private&quot;<br />
&quot;public&quot; zu erklaeren, habe nun ausserdem auch noch beide Klassen Forward-<br />
deklariert (als auch selbiges versucht mit der Inneren Klasse). Tja der Fehler<br />
ist immer derselbe, diesmal:</p>
<blockquote>
<p>&quot;Groovy_t&quot; in class &quot;BattleField&quot; does not name a type</p>
</blockquote>
<p>Wie gesagt, ich dachte es sei einfacher.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622177</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Thu, 27 Nov 2008 21:53:56 GMT]]></title><description><![CDATA[<p>Sorry, ich hatte vorhin was falsch; so sollte es sein:</p>
<pre><code class="language-cpp">BattleField::Groovy_t BattleField::groovy;
</code></pre>
<p>Aber was bringt dir das <code>typedef</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622186</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Fri, 28 Nov 2008 06:17:30 GMT]]></title><description><![CDATA[<p>Also erstmal: struct ist bis auf die Berechtigung immernoch gleich class. Der Typedef ist überflüssig.</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>Hmm.. verstehe das Problem jetzt nicht ganz, wenn ich es in den Header schreibe<br />
und einen Inlcude Guard benutze, dann wird die static Variable doch auch nur<br />
einmal definiert?! Ausserdem habe ich im Bsp, zB nur ein File .cpp</p>
</blockquote>
<p>Wenn Du aber diese Headerdatei in zwei unabhängigen Sourcen einbindest, hast Du die Definition zweimal. Da helfen auch Includeguards nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622246</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 28 Nov 2008 06:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Fri, 28 Nov 2008 07:22:24 GMT]]></title><description><![CDATA[<p>genau und bim zusammenlinken der beiden objectdateien, wird der linker feststellen, dass da zwei symbole sind, die gleich heißen und mit nem Linker error abbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622261</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Fri, 28 Nov 2008 07:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to static Member Variable geht irgendwie nicht on Fri, 28 Nov 2008 11:35:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Ich habe jetzt etwas damit herumgespielt. Ich hatte Deine Erklaerung leider etwas falsch verstanden, naemlich dass die Zeile _zusaetzlich_ ist.</p>
<p>Wichtig ist also, dass man:<br />
1. die static Deklaration weiterhin innerhalb der Klasse steht (private oder public definition des Typs scheint irrelevant zu sein):</p>
<pre><code class="language-cpp">static Groovy_t groovy;
</code></pre>
<p>2. ...HINTER der Klasse muss man dann die static Variable definieren, aber ohne static, so wie Nexus das erklaert hat:</p>
<pre><code class="language-cpp">BattleField::Groovy_t BattleField::groovy;
</code></pre>
<p>Mein laufender Code sieht dann so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class BaseGroove
{
public:
  BaseGroove(int arg){ std::cout &lt;&lt; &quot;BaseGroove::BaseGroove( &quot; &lt;&lt; arg &lt;&lt; &quot; ) - ctor\n&quot;; }
  void doGroove(){ std::cout &lt;&lt; &quot;BaseGroove::doGroove()\n&quot;; }
};

#define ARGUMENT 777

class BattleField
{
private:
  struct MyGroove : public BaseGroove
  {
    MyGroove()
      : BaseGroove( ARGUMENT){ std::cout &lt;&lt; &quot;MyGroove::MyGroove()\n&quot;; }
  };

  typedef struct MyGroove
    Groovy_t;

  static Groovy_t groovy;

public:
  static void getStatic()
  {
    std::cout &lt;&lt; &quot;BattleField::getStatic()\n&quot;;

    // jetzt laeufts!
    groovy.doGroove();
  }
};

BattleField::Groovy_t BattleField::groovy;

int main(){
  BattleField::getStatic();
  return 0;
}
</code></pre>
<p>Wahrscheinlich war fuer mich deshalb die Aufteilung in .cpp und .hpp File etwas verwirrend. Nja, ich denke es ist ja klar, dass wen ich etwas auf zwei Files aufteile ich es trotzdem nur einmal definieren werde und nicht re-definiere, oder? Das meinte ich auch nicht mit dem Include Guard, mir war hier nicht klar, dass man eben die obigen 2 Zeilen braucht und es um deren Aufteilung geht.</p>
<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>genau und bim zusammenlinken der beiden ...</p>
</blockquote>
<p>Ja und genau... <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="😉"
    /><br />
Ok, ok, ok, das typedef duerft Ihr auch weglassen, wenn Ihr wollt! <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="😉"
    /> Ich hatte die Diskussion ja erst und hab das mittlerweile schon begriffen. Das typedef befindet sich hier im Code, weil... ich es einerseits aus einer C-Gewohnheit verwende,.. weil ich es im Original auch so benutze, und da hauptsaechlich um einen Typ zu bekommen, der sich irgendwie &quot;..._t&quot; nennt. Auch eine Gewohnheit. Aber das ist doch eigentlich auch total egal fuer das Problem hier, oder?! Genau!</p>
<p>Danke Euch allen fuer die Beantwortung!!! :xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622367</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 28 Nov 2008 11:35:21 GMT</pubDate></item></channel></rss>