<?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[globale Variablen in header-Dateien]]></title><description><![CDATA[<p>Servus,</p>
<p>ich habe in meinem neuen Projekt ein paar Singletons, für die ich jeweils globale Pointer anlegen will, um nicht dauernd über ::getInstance() zugreifen zu müssen.</p>
<p>Daher habe ich versucht, einfach innerhalb der .h-Datei, und zwar unter der class-Definition, einen globalen Pointer zu machen, also etwa so:</p>
<pre><code class="language-cpp">#ifndef _BLABLA_H_
#define _BLABLA_H_

class Blabla
{
// singleton zeugs...
};

Blabla* bla = Blabla::getInstance();

#endif
</code></pre>
<p>Leider funktioniert das nicht. Sobald ich das kompilieren will, sagt mir der Linker, das Symbol wäre schon anderswo definiert. Dabei steht die Deklaration ja innerhalb des #ifndef, also kann es nicht an mehrfachen includes liegen.</p>
<p>Danach habe ich einfach mal versucht, statt der Pointer-Zeile einfach mal ein int a = 45; reinzuschreiben, aber auch hier tritt exakt der gleiche Fehler auf.</p>
<p>Weiß jemand, woran das liegt? Wenn ich sowas global in eine .cpp-Datei schreibe, funktioniert es tadellos. Daher dachte ich auch zuerst an mehrfaches includen, aber wie gesagt, es steht korrekt innerhalb des #ifndef. Und zudem ist es sogar so, daß dort, wo angeblich das Symbol bereits definiert wurde, die .h-Datei sowieso nicht includet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182685/globale-variablen-in-header-dateien</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:29:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182685.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 May 2007 08:19:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 08:19:59 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich habe in meinem neuen Projekt ein paar Singletons, für die ich jeweils globale Pointer anlegen will, um nicht dauernd über ::getInstance() zugreifen zu müssen.</p>
<p>Daher habe ich versucht, einfach innerhalb der .h-Datei, und zwar unter der class-Definition, einen globalen Pointer zu machen, also etwa so:</p>
<pre><code class="language-cpp">#ifndef _BLABLA_H_
#define _BLABLA_H_

class Blabla
{
// singleton zeugs...
};

Blabla* bla = Blabla::getInstance();

#endif
</code></pre>
<p>Leider funktioniert das nicht. Sobald ich das kompilieren will, sagt mir der Linker, das Symbol wäre schon anderswo definiert. Dabei steht die Deklaration ja innerhalb des #ifndef, also kann es nicht an mehrfachen includes liegen.</p>
<p>Danach habe ich einfach mal versucht, statt der Pointer-Zeile einfach mal ein int a = 45; reinzuschreiben, aber auch hier tritt exakt der gleiche Fehler auf.</p>
<p>Weiß jemand, woran das liegt? Wenn ich sowas global in eine .cpp-Datei schreibe, funktioniert es tadellos. Daher dachte ich auch zuerst an mehrfaches includen, aber wie gesagt, es steht korrekt innerhalb des #ifndef. Und zudem ist es sogar so, daß dort, wo angeblich das Symbol bereits definiert wurde, die .h-Datei sowieso nicht includet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293485</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 May 2007 08:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 08:21:15 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Warum verwendet du nicht einfach eine freie inline Funktion?</p>
<p>chrische</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293487</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 May 2007 08:21:15 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 08:34:43 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Include Guards schützen nur vor Mehrfachdefinition in einer Übersetzungseinheit : also etwas was den Compiler betrifft. Da du aber einen Linkerfehler bekommst macht schon deutlich das du ein Problem beim Zusammenspiel mehrerer Übsersetzungseinheiten hast.<br />
Und zwar genauer taucht nun in jeder Übersetzungseinheit ein eigener Zeiger bla auf und wird jedesmal mit getInstanzce initialisiert.<br />
Um das zu lösen must du extern verwenden :</p>
<pre><code class="language-cpp">// Header
extern Blabla* bla;

// Implementation
Blabla* bla = Blabla::getInstance();
</code></pre>
<p>Jetzt gibt es auch wirklich für alle Übersetzungseinheiten nur genau einen Zeiger.<br />
Aber auch ich würde eine einfache Funktion bevorzugen, was verhindert das doch jemand schreibend auf den Pointer selber zugreift</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293491</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 28 May 2007 08:34:43 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 09:56:50 GMT]]></title><description><![CDATA[<p>Hmm ich komm jetzt grad nicht ganz mit, was genau meint ihr denn mit der inline-Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293556</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 May 2007 09:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 11:22:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Eine Funktion die im Header des Singletons steht und nichts weiter macht als</p>
<pre><code class="language-cpp">Blabla* bla get()
{
  return Blabla::getInstance();
}
</code></pre>
<p>Damit hast du einerseits einen einfachen Aufruf, anderseits kann das der Compiler in den meisten Fällen direkt in den Aufruf inlinen, also keine zusätzlichen Funktionsaufruf (zusätzlich zu getInstance)<br />
Der Vorteil gegenüber der extern-Pointer Variante ist das von außen der interne Singleton-Pointer nicht umgelenkt werden kann.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293636</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 28 May 2007 11:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 11:31:47 GMT]]></title><description><![CDATA[<p>Hmm aber ob ich nun get() oder getInstance() aufrufe, ist doch dann komplett egal, oder nicht?</p>
<p>Meine getInstance() sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">static Blabla* getInstance()
{
    static Blabla* instance;

    if (instance == NULL)
        instance = new Blabla;

    return instance;
}
</code></pre>
<p>Und genau das würde ja dann nach wie vor passieren, also inkl. dem NULL-Check, wenn ich get() aufrufe. Und daß get() ge-inlined wird, bringt ja dann auch nur, daß der Aufruf eben nicht noch umständlicher wird, aber gewonnen habe ich dadurch doch überhaupt nix?</p>
<p>Ich glaub da gefällt mir die extern-Lösung besser, funktionieren tut's jedenfalls ausgezeichnet <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="😉"
    /> Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293647</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 May 2007 11:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 11:48:26 GMT]]></title><description><![CDATA[<p>Rock Lobster schrieb:</p>
<blockquote>
<p>Meine getInstance() sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">static Blabla* getInstance()
{
    static Blabla* instance;

    if (instance == NULL)
        instance = new Blabla;

    return instance;
}
</code></pre>
</blockquote>
<p>Jetzt ändere die mal in</p>
<pre><code class="language-cpp">static Blabla* getInstance()
{
    static Blabla instance;
    return &amp;instance;
}
</code></pre>
<p>Dann wird sogar korrekt aufgeräumt.</p>
<p>und dann mach aus dem Zeiger noch ne Referenz und das ganze ist noch bequemer zu verwenden:</p>
<pre><code class="language-cpp">static Blabla &amp; getInstance()
{
    static Blabla instance;
    return instance;
}
</code></pre>
<p>Musst dann natürlich auch den anderen Kram anpassen:</p>
<pre><code class="language-cpp">// Header
extern Blabla &amp; bla;

// Implementation
Blabla &amp; bla = Blabla::getInstance();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1293665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293665</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Mon, 28 May 2007 11:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to globale Variablen in header-Dateien on Mon, 28 May 2007 11:58:10 GMT]]></title><description><![CDATA[<p>Hmm danke, da sieht man mal wie Java-verseucht ich schon bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Nur das mit dem zweiten Punkt erschließt sich mir nicht so ganz, im Prinzip ist es doch egal, ob ich mit dem Pointer und -&gt; oder direkt mit dem Objekt und . arbeite, oder? Bzw. ist es genau das, was Du damit bezweckst, oder gibt's da noch 'nen anderen Vorteil?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293678</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 May 2007 11:58:10 GMT</pubDate></item></channel></rss>