<?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[g++ recursive_init]]></title><description><![CDATA[<p>Hi,<br />
folgender Quellcode:</p>
<pre><code class="language-cpp">// Foo.h
class Foo
{
public:
  Foo();
};

// #########################

// Foo.cpp
#include &quot;Bar.h&quot;
#include &quot;Foo.h&quot;

Foo::Foo()
{
  Bar::Instance();
}

// #########################

// Bar.h
class Bar: public Foo
{
private:
  Bar()
  {
  }

public:
  static Bar&amp; Instance()
  {
    static Bar bar;
    return bar;	
  }
};

// #######################

// Main.cpp
Foo foo;
</code></pre>
<p>aufgeteilt in die entsprechenden Dateien (wie angegeben).<br />
Kompiliere ich das ganze mit dem g++ und fuehre es aus erscheint:</p>
<blockquote>
<p>terminate called after throwing an instance of '__gnu_cxx::recursive_init'<br />
what(): N9__gnu_cxx14recursive_initE<br />
Aborted</p>
</blockquote>
<p>Visual Studio 2005 EE schluckt das ganze ohne Murren.</p>
<p>Mal von dem schlechten Design abgesehen,<br />
ist das legaler C++ Code (im Sinne von definiertes Verhalten)?</p>
<p>Also Problem ist der Zugriff auf Bar::Instance im Konstruktor von Foo. Dadurch wird ein statisches Bar-Objekt erstellt, welches wiederrum ein Foo ist (public Vererbung). Dadurch, dass es ein Foo ist wird erneut Bar::Instance aufgerufen, obwohl das einzige Bar-Objekt (da Singleton) noch nicht vollkommen erstellt ist.</p>
<p>Gruß,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201667/g-recursive_init</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 03:21:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201667.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Jan 2008 18:22:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to g++ recursive_init on Wed, 02 Jan 2008 18:22:53 GMT]]></title><description><![CDATA[<p>Hi,<br />
folgender Quellcode:</p>
<pre><code class="language-cpp">// Foo.h
class Foo
{
public:
  Foo();
};

// #########################

// Foo.cpp
#include &quot;Bar.h&quot;
#include &quot;Foo.h&quot;

Foo::Foo()
{
  Bar::Instance();
}

// #########################

// Bar.h
class Bar: public Foo
{
private:
  Bar()
  {
  }

public:
  static Bar&amp; Instance()
  {
    static Bar bar;
    return bar;	
  }
};

// #######################

// Main.cpp
Foo foo;
</code></pre>
<p>aufgeteilt in die entsprechenden Dateien (wie angegeben).<br />
Kompiliere ich das ganze mit dem g++ und fuehre es aus erscheint:</p>
<blockquote>
<p>terminate called after throwing an instance of '__gnu_cxx::recursive_init'<br />
what(): N9__gnu_cxx14recursive_initE<br />
Aborted</p>
</blockquote>
<p>Visual Studio 2005 EE schluckt das ganze ohne Murren.</p>
<p>Mal von dem schlechten Design abgesehen,<br />
ist das legaler C++ Code (im Sinne von definiertes Verhalten)?</p>
<p>Also Problem ist der Zugriff auf Bar::Instance im Konstruktor von Foo. Dadurch wird ein statisches Bar-Objekt erstellt, welches wiederrum ein Foo ist (public Vererbung). Dadurch, dass es ein Foo ist wird erneut Bar::Instance aufgerufen, obwohl das einzige Bar-Objekt (da Singleton) noch nicht vollkommen erstellt ist.</p>
<p>Gruß,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429516</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Wed, 02 Jan 2008 18:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to g++ recursive_init on Wed, 02 Jan 2008 23:07:39 GMT]]></title><description><![CDATA[<p>Naja es ist nicht nur schlechtes Design ... lass mal im Konstruktor von foo etwas ausgeben, dann erkennst du vllt. warum <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/1429633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429633</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 02 Jan 2008 23:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to g++ recursive_init on Thu, 03 Jan 2008 07:36:26 GMT]]></title><description><![CDATA[<p>Verpass Foo doch einfach zusätzlich einen privaten/protected Konstruktor den du dann vom Bar Konstruktor aus aufrufst.<br />
Dann ist da nixmehr rekursiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429705</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Jan 2008 07:36:26 GMT</pubDate></item></channel></rss>