<?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 bezüglich Standard und Objekt-Lebenszeit]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">//Header.hpp
namespace 
{
  class Type
  {
    private:
    public:
      Type();
      ~Type();
  };
  extern Type Obj;
}
//Wie Header.cpp aussieht könnt ihr euch vorstellen
//Main.cpp
#include &quot;Header.hpp&quot;
//Hier könnten ein paar Objekte stehen
int main()
{
//Hier auch
}
</code></pre>
<p>Wird hier garantiert, dass der Konstruktor von &quot; <code>Obj</code> &quot; als erster und der Destruktor als letzter aufgerufen werden (also vor allen anderen Konstruktoren und nach allen anderen Destruktoren)?</p>
<p>MfG, EOutOfResources</p>
<p>EDIT: Für die Frage &quot;wieso&quot;: C-Library (one more time)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290803/frage-bezüglich-standard-und-objekt-lebenszeit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 06:28:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290803.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Aug 2011 17:37:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 17:41:00 GMT]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">//Header.hpp
namespace 
{
  class Type
  {
    private:
    public:
      Type();
      ~Type();
  };
  extern Type Obj;
}
//Wie Header.cpp aussieht könnt ihr euch vorstellen
//Main.cpp
#include &quot;Header.hpp&quot;
//Hier könnten ein paar Objekte stehen
int main()
{
//Hier auch
}
</code></pre>
<p>Wird hier garantiert, dass der Konstruktor von &quot; <code>Obj</code> &quot; als erster und der Destruktor als letzter aufgerufen werden (also vor allen anderen Konstruktoren und nach allen anderen Destruktoren)?</p>
<p>MfG, EOutOfResources</p>
<p>EDIT: Für die Frage &quot;wieso&quot;: C-Library (one more time)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101341</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 17:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 17:43:27 GMT]]></title><description><![CDATA[<p>Das sollte, nach 3.6.2,1 undefiniert sein, weil die Aufteilung auf mehrere Übersetzungseinheiten die Ordnung durch den namespace-Scope aufhebt.</p>
<p>Und allgemein ist das natürlich schlechtes Design, wenn es bei dir auf die Initialisierungsreihenfolge von globalen Objekten ankommt, aber das ist dir sicherlich selber klar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101345</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 03 Aug 2011 17:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 18:04:37 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Und allgemein ist das natürlich schlechtes Design, wenn es bei dir auf die Initialisierungsreihenfolge von globalen Objekten ankommt, aber das ist dir sicherlich selber klar.</p>
</blockquote>
<p>Das kannst du mal OpenAL sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101354</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 18:04:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 18:11:57 GMT]]></title><description><![CDATA[<p>Wenn du wirklich einen unnamed Namespace gemeint hast, dann wäre die Reihenfolge definiert, wenn da nicht das &quot;extern&quot; wäre.</p>
<p>Mit &quot;extern&quot; hast du ein Problem, da <code>[unnamed-namespace-in-main.cpp]::Obj</code> nirgends definiert wird, bloss deklariert. <code>[unnamed-namespace-in-header.cpp]::Obj</code> wird zwar vermutlich definiert, nur das ist ein anderes Objekt, mit einem anderen Typ, und aus main.cpp nicht ansprechbar.</p>
<p>Angenomman es war ein benannter Namespace gemeint, dann ist die Reihenfolge undefiniert.</p>
<p>Einzige Lösung dir mir jetzt einfällt, ist, ein Singleton zu verwenden, ala so:</p>
<pre><code class="language-cpp">//Header.hpp
namespace Foo // muss wie schon gesagt nen Namen haben
{
  class Type
  {
    private:
      Type();
      ~Type();
    public:
      friend Type&amp; GetInstance()
      {
          static Type Obj;
          return Obj;
      }
  };
}

namespace // diesmal wirklich unnamed, damit's in jeder Translation-Unit eine eigene (unabhängige) Referenz &quot;Obj&quot; gibt
{
    Foo::Type&amp; Obj = Foo::Type::GetInstance();
}

// Rest wie in deinem Beispiel
</code></pre>
<p>Bzw. es muss natürlich &quot;Type&quot; nicht gleich ein Singleton sein. Wichtig ist, dass jede TU selbst &quot;Type::GetInstance()&quot; aufruft um ein Objekt zu initialisieren das in dieser TU definiert wird (=die &quot;Obj&quot; Referenz im unnamed Namespace).</p>
<p>Beim ersten Aufruf von &quot;Type::GetInstance()&quot; wird dann das &quot;static local&quot; Objekt initialisiert, und das passiert dann garantiertermassen vor der Initialisierung von Dingen die nach dem #include &quot;header.hpp&quot; definiert sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101358</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 03 Aug 2011 18:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 18:37:22 GMT]]></title><description><![CDATA[<p>Jetzt bin ich verwirrt. Das <code>extern</code> brauch ich wegen der ODR (nicht?). Und ich dachte, der anonyme Namensbereich (bzw. sein Inhalt) sei nur für die Übersetzungseinheit ansprechbar, die ihn auch definiert. Deshalb habe ich die Klasse &quot; <code>Type</code> &quot; in den anonymen Namensbereich getan (dass der User sie nicht anfassen kann). Und was ich mit all dem bezwecken will ist, dass eine Funktion aufgerufen wird und ihre Rückgabe gespeichert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101376</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 18:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 18:51:02 GMT]]></title><description><![CDATA[<p>Der Punkt ist, daß die Ziele des anonymen Namensraums und des extern einander widersprechen. Durch den anonymen Namensraum sind die Bezeichner &quot;Type&quot; und &quot;Obj&quot; nur in der aktuellen Übersetzungseinheit bekannt (bzw. werden in jeder Übersetzungseinheit eindeutig neu deklariert), extern sagt aus, daß die Variable an anderer Stelle definiert werden soll.<br />
(und solange die Klasse im Header ist, kann sie auch woanders eingebunden werden)</p>
<p>Eventuell solltest du mal erklären, was genau du mit der gesamten Kontruktion eigentlich bewirken willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101395</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 03 Aug 2011 18:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 19:07:32 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Eventuell solltest du mal erklären, was genau du mit der gesamten Kontruktion eigentlich bewirken willst.</p>
</blockquote>
<p>&quot; <code>Type</code> &quot; ist eine Klasse die im Konstruktor eine Funktion aufruft und im Destruktor ebenfalls eine Funktion aufruft. Das Ergebnis der ersten Funktion wird gespeichert. So ungefähr sieht das dann aus:<br />
Type.hpp:</p>
<pre><code class="language-cpp">//Jaja, Include-Guards. Hab ich im Original...
namespace
{
  class Type
  {
    private:
      void* Handle;
      Type(const Type&amp;);
      Type&amp; operator= (const Type&amp;) const;
    public:
      Type();
      ~Type();
      void* Get();
  };
  extern Type Obj;
}
</code></pre>
<p>Type.cpp:</p>
<pre><code class="language-cpp">#include &quot;Type.hpp&quot;
Type::Type()
{
  this-&gt;Handle = Func_Begin();
}
Type::~Type()
{
  Func_End(this-&gt;Handle);
}
void* Type::Get()
{
  return this-&gt;Handle;
}
Type Obj;
</code></pre>
<p>Der Konstruktor und der Destruktor sind im Original noch ein wenig praller, damit das Ganze ausnahmesicher ist.<br />
Noch konkreter:<br />
Die Funktion &quot; <code>Func_Begin</code> &quot; gibt ein Handle auf ein Device zurück (nötig für alle anderen Dinge der Lib) und die Funktion &quot; <code>Func_End</code> &quot; zerstört das Handle wieder.</p>
<p>EDIT: Was ich mir gedacht habe:<br />
Ich wusste, dass ich einen Funktionsaufruf zu Beginn benötigte -&gt; Gedanke an Konstuktor -&gt; Klasse, von der eine Instanz existiert -&gt; Gleichzeitig auch Speicher des Handles</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101409</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 19:07:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 19:13:39 GMT]]></title><description><![CDATA[<p>Können denn eigentlich mehrere Objekte deiner Klasse existieren? Wenn ja, hat dann jedes Objekt sein eigenes Handle?<br />
In dem Fall kannst du die Geschichte mit dem anonymen Namensraum und der (doch nicht so) globalen Variablen verzichten und dort wo benötigt ein Objekt anlegen. Andernfalls dürfte die Singleton-Konstruktion, die hustbär vorgeschlagen hat, die stabilere Lösung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101417</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 03 Aug 2011 19:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 19:31:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Können denn eigentlich mehrere Objekte deiner Klasse existieren?</p>
</blockquote>
<p>Rein von der Logik her, nein. Aber ich hab es noch nicht verboten, da ich ja der Einzige bin, der Zugriff auf die Klasse hat.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>In dem Fall kannst du die Geschichte mit dem anonymen Namensraum und der (doch nicht so) globalen Variablen verzichten und dort wo benötigt ein Objekt anlegen.</p>
</blockquote>
<p>Daran habe ich auch gedacht, aber ich weis nicht, wie es mit der Performance der Funktion aussieht (werde ich mal testen).</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Andernfalls dürfte die Singleton-Konstruktion, die hustbär vorgeschlagen hat, die stabilere Lösung sein.</p>
</blockquote>
<p>Werde ich auch mal testen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101426</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 19:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 19:41:55 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Können denn eigentlich mehrere Objekte deiner Klasse existieren?</p>
</blockquote>
<p>Rein von der Logik her, nein. Aber ich hab es noch nicht verboten, da ich ja der Einzige bin, der Zugriff auf die Klasse hat.</p>
</blockquote>
<p>Solche internen Details packt man dan aber nicht in Header, die überall offen im Quelltext untergebracht werden. Wenn diese Klasse nur dazu da ist, dein globales Device-Handle zu verwalten, kannst du sie auch in der ÜE lokal definieren, die mit diesem Handle arbeiten will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101438</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 03 Aug 2011 19:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 20:02:52 GMT]]></title><description><![CDATA[<p>So. Habe es nun mit dem Singleton-Pattern gemacht und soweit funktioniert alles wunderbar. Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101453</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 03 Aug 2011 20:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Wed, 03 Aug 2011 21:12:59 GMT]]></title><description><![CDATA[<p>Wenn du nur ne Funktion aufrufen willst, dann vielleicht einfach so:</p>
<pre><code class="language-cpp">// header.hpp

namespace Detail
{
int CallMeOnceBeforeDoingStuff();
}

namespace
{
int const g_initHelperDummy = CallMeOnceBeforeDoingStuff();
}

// ---------------------------------------------------------------

// header.cpp

namespace Detail
{

boost::once_flag g_onceFlag = BOOST_ONCE_INIT;

void CallMeOnceBeforeDoingStuffImpl()
{
// do whatever needs to be done
}

int CallMeOnceBeforeDoingStuff()
{
    boost::call_once(CallMeOnceBeforeDoingStuffImpl, g_onceFlag);
}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2101487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101487</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 03 Aug 2011 21:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bezüglich Standard und Objekt-Lebenszeit on Thu, 04 Aug 2011 09:04:48 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Jetzt bin ich verwirrt.</p>
</blockquote>
<p>Das glaube ich.</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Das <code>extern</code> brauch ich wegen der ODR (nicht?).</p>
</blockquote>
<p>In diesem Fall verwendest Du es, um eine Definition in eine Deklaration zu verwandeln. So oder so hat das Ding eine externe Bindung. Nur ist der Name unaussprechbar und ÜE-spezifisch wegen des anonymen Namensraums.</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Und ich dachte, der anonyme Namensbereich (bzw. sein Inhalt) sei nur für die Übersetzungseinheit ansprechbar, die ihn auch definiert. Deshalb habe ich die Klasse &quot; <code>Type</code> &quot; in den anonymen Namensbereich getan (dass der User sie nicht anfassen kann).</p>
</blockquote>
<p>Diese Logik kann ich nicht nachvollziehen. Ich schätze, dass Du da noch ein paar Sachen falsch verstehst.</p>
<p>Wegen des anonymen Namensraums gibt es in jeder ÜE, die diese Include-Datei einbindet, einen eigenen Typ &quot;Type&quot;. Und nur der &quot;Type&quot; innerhalb von Type.cpp wird als einziger &quot;ausdefiniert&quot; (also Konstruktor &amp; co). Auch die reine Deklaration von Obj im anonymen Namensraum ist sinnfrei, da du es nicht in einer anderen ÜE definieren kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2101617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2101617</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 04 Aug 2011 09:04:48 GMT</pubDate></item></channel></rss>