<?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[Frage zu Singleton, shared_ptr und static]]></title><description><![CDATA[<p>Hallo alle zusammen, ich habe da mal eine Frage,</p>
<p>Wenn ich die Funktion mit static schreibe, dann erstellt er beim ersten Aufruf ein Objekt und gibt es dann zurück, aber wenn dann func2() aufgerufen wird, dann erstellt er ein neues Objekt, so das ich nicht auf das Original zugreife.</p>
<p>Wenn ich es ohne static schreibe, dann erstellt er beim ersten Aufruf ein Objekt, und ich kann in func1() und func2() auf das selbe zugreifen.</p>
<p>Es wäre nett wenn mir einer von euch das Verhalten erklären würde.</p>
<p>Ohne static</p>
<pre><code class="language-cpp">typedef std::tr1::shared_ptr&lt;sf::RenderWindow&gt; RenderWindowPtr;

inline RenderWindowPtr getRenderWindow()
{
        static RenderWindowPtr window;
        if (window == 0)
            window.reset(new sf::RenderWindow);
        return window;
}
</code></pre>
<p>Mit static</p>
<pre><code class="language-cpp">typedef std::tr1::shared_ptr&lt;sf::RenderWindow&gt; RenderWindowPtr;

inline static RenderWindowPtr getRenderWindow()
{
        static RenderWindowPtr window;
        if (window == 0)
            window.reset(new sf::RenderWindow);
        return window;
}
</code></pre>
<p>Beispiel:</p>
<pre><code class="language-cpp">void func1()
{
   RenderWindowPtr window = getRenderWindow();
   window-&gt;Draw();
}

void func2()
{
   RenderWindowPtr window = getRenderWindow();
   window-&gt;Draw();
}

void test()
{
    func1();
    func2();
}
</code></pre>
<p>Gruß, Daniel_S</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244270/frage-zu-singleton-shared_ptr-und-static</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:15:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244270.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Jun 2009 19:11:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Singleton, shared_ptr und static on Sat, 27 Jun 2009 19:11:30 GMT]]></title><description><![CDATA[<p>Hallo alle zusammen, ich habe da mal eine Frage,</p>
<p>Wenn ich die Funktion mit static schreibe, dann erstellt er beim ersten Aufruf ein Objekt und gibt es dann zurück, aber wenn dann func2() aufgerufen wird, dann erstellt er ein neues Objekt, so das ich nicht auf das Original zugreife.</p>
<p>Wenn ich es ohne static schreibe, dann erstellt er beim ersten Aufruf ein Objekt, und ich kann in func1() und func2() auf das selbe zugreifen.</p>
<p>Es wäre nett wenn mir einer von euch das Verhalten erklären würde.</p>
<p>Ohne static</p>
<pre><code class="language-cpp">typedef std::tr1::shared_ptr&lt;sf::RenderWindow&gt; RenderWindowPtr;

inline RenderWindowPtr getRenderWindow()
{
        static RenderWindowPtr window;
        if (window == 0)
            window.reset(new sf::RenderWindow);
        return window;
}
</code></pre>
<p>Mit static</p>
<pre><code class="language-cpp">typedef std::tr1::shared_ptr&lt;sf::RenderWindow&gt; RenderWindowPtr;

inline static RenderWindowPtr getRenderWindow()
{
        static RenderWindowPtr window;
        if (window == 0)
            window.reset(new sf::RenderWindow);
        return window;
}
</code></pre>
<p>Beispiel:</p>
<pre><code class="language-cpp">void func1()
{
   RenderWindowPtr window = getRenderWindow();
   window-&gt;Draw();
}

void func2()
{
   RenderWindowPtr window = getRenderWindow();
   window-&gt;Draw();
}

void test()
{
    func1();
    func2();
}
</code></pre>
<p>Gruß, Daniel_S</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733804</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 27 Jun 2009 19:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Singleton, shared_ptr und static on Sat, 27 Jun 2009 19:57:55 GMT]]></title><description><![CDATA[<p>Daniel_S schrieb:</p>
<blockquote>
<p>Wenn ich die Funktion mit static schreibe, dann erstellt er beim ersten Aufruf ein Objekt und gibt es dann zurück, aber wenn dann func2() aufgerufen wird, dann erstellt er ein neues Objekt, so das ich nicht auf das Original zugreife.</p>
<p>Wenn ich es ohne static schreibe, dann erstellt er beim ersten Aufruf ein Objekt, und ich kann in func1() und func2() auf das selbe zugreifen.</p>
<p>Es wäre nett wenn mir einer von euch das Verhalten erklären würde.</p>
</blockquote>
<p>Ich hätte eine Erklärung, falls func1 und func2 in verschiedenen Übersetzungseinheiten definiert wurden und getRenderWindow in einem Header definiert wurde, welcher in mehrere Übersetzungseinheiten eingebunden wird.</p>
<p>Das würde zumindest Deine Beobachtung erklären; denn wenn Du eine Funktion mit <code>static</code> deklarierst hat sie &quot;internal linkage&quot;. Das heißt, es wird mehrere Versionen davon geben --- in jeder Übersetzungseinheit, die diesen Header einbindet, eine eigene Version.</p>
<p>Wenn Du das <code>static</code> weglässt, hat die Funktion &quot;external linkage&quot;. Die gibt's dann nur einmal. Dass Du Dein Programm ohne <code>static</code> überhaupt übersetzen kannst, liegt daran, dass Du die Funktion als <code>inline</code> -Funktion deklarierst. Für diese Funktionen macht die &quot;one definition rule&quot; eine Aussahme. Ansonsten würde nämlich der Linker meckern ...</p>
<p>Wie wär's mit folgendem:<br />
- DeKLARIERE die getRenderWindow-Funktion nur in einem Header<br />
- DeFINIERE sie in einer eigenen Übersetzungseinheit.<br />
- Lass <code>inline</code> weg</p>
<p>HTH,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733810</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 27 Jun 2009 19:57:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Singleton, shared_ptr und static on Sat, 27 Jun 2009 20:00:40 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>- DeKLARIERE die getRenderWindow-Funktion nur in einem Header<br />
- DeFINIERE sie in einer eigenen Übersetzungseinheit.<br />
- Lass <code>inline</code> weg</p>
</blockquote>
<p>- Lass <code>static</code> weg, Deine Funktion muss &quot;external linkage&quot; haben</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733811</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 27 Jun 2009 20:00:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Singleton, shared_ptr und static on Sun, 28 Jun 2009 07:42:57 GMT]]></title><description><![CDATA[<p>Ah, ja das stimmt. getRenderWindow() ist in einer Header deklariert und definiert, welche ich in mehrere cpp Dateien nutze.<br />
Vielen Dank für deine Erklärung.</p>
<p>Gruß, Daniel_S</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733920</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sun, 28 Jun 2009 07:42:57 GMT</pubDate></item></channel></rss>