<?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[objekt als klassenkonstante - geht das?]]></title><description><![CDATA[<p>kann man Objekte als Klassenkonstanten festlegen? Also analog zu &quot;static const int=12;&quot; im Header.<br />
Zwei Varianten kenne ich - gefallen mir beide nicht:<br />
1. Das klassenkonstante Objekt einfach im Konstruktor erzeugen bzw. initialisieren.</p>
<p>2. eine static const Funktion die das Objekt in einer static Variablen hält und beim ersten Aufruf es initialisiert und zurückgibt.</p>
<p>Kann man das ganze nicht direkter machen? Also das man in der Deklaration der Klasse sieht, das sie eine Konstante(ein Klasse) mit folgendem Wert(ein Objekt) hat?</p>
<p>Geht das ganze eventuell nur mit bestimmten Typen/Klassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241256/objekt-als-klassenkonstante-geht-das</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 17:31:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241256.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 May 2009 11:02:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:02:09 GMT]]></title><description><![CDATA[<p>kann man Objekte als Klassenkonstanten festlegen? Also analog zu &quot;static const int=12;&quot; im Header.<br />
Zwei Varianten kenne ich - gefallen mir beide nicht:<br />
1. Das klassenkonstante Objekt einfach im Konstruktor erzeugen bzw. initialisieren.</p>
<p>2. eine static const Funktion die das Objekt in einer static Variablen hält und beim ersten Aufruf es initialisiert und zurückgibt.</p>
<p>Kann man das ganze nicht direkter machen? Also das man in der Deklaration der Klasse sieht, das sie eine Konstante(ein Klasse) mit folgendem Wert(ein Objekt) hat?</p>
<p>Geht das ganze eventuell nur mit bestimmten Typen/Klassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712116</guid><dc:creator><![CDATA[dermoritz]]></dc:creator><pubDate>Mon, 18 May 2009 11:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:10:22 GMT]]></title><description><![CDATA[<p>Eigene Klassen verhalten sich genauso wie die eingebauten Datentypen. Du kannst alles ganz genauso machen wie du es von diesen her kennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712123</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 18 May 2009 11:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:16:32 GMT]]></title><description><![CDATA[<p>dermoritz schrieb:</p>
<blockquote>
<p>Zwei Varianten kenne ich - gefallen mir beide nicht:<br />
1. Das klassenkonstante Objekt einfach im Konstruktor erzeugen bzw. initialisieren.</p>
</blockquote>
<p>Woher kennst du die Variante? Das funktioniert nämlich nicht. Statische Objekte werden bereits vor der ersten Instanz der Klasse erzeugt und initialisiert, und zwar einmal. Im Konstruktor kannst du es also weder erzeugen (da es schon existiert) noch verändern (da es const ist).</p>
<blockquote>
<p>Kann man das ganze nicht direkter machen? Also das man in der Deklaration der Klasse sieht, das sie eine Konstante(ein Klasse) mit folgendem Wert(ein Objekt) hat?</p>
<p>Geht das ganze eventuell nur mit bestimmten Typen/Klassen?</p>
</blockquote>
<p>Klares jein:<br />
- Du kannst konstante statische Member jeden Typs haben.<br />
- Du kannst nur Integrale Typen direkt mit einem Wert belegen.<br />
- Alle anderen Typen müssen einmalig (in einer einzigen Übersetzungseinheit, also nicht im header) definiert und initialisiert werden.</p>
<pre><code class="language-cpp">//X.h
class Foo { /* ... */ };

class X
{
  const static int i = 15; //ok
  //const static Foo f = xyz; //FEHLER, nur integrale Typen mit Initialisierung hier
  const static Foo f; //ok, Deklaration
};

//X.cpp
const Foo X::f = createSomeFoo(); //Definition und Initialisierung
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1712126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712126</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 May 2009 11:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:18:57 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Eigene Klassen verhalten sich genauso wie die eingebauten Datentypen. Du kannst alles ganz genauso machen wie du es von diesen her kennst.</p>
</blockquote>
<p>hmmmmmmm ... ich glaube, da irrst Du.<br />
Es gibt einige wenige Ausnahmen, bei denen sich primitive Typen von anderen unterscheiden(z.B. dass man von primitiven Typen nicht ableiten kann, dass bestimmte primitive Typen als template-parameter infrage kommen (andere Typen nicht), ...)<br />
- und dieser Fall gehört IIRC dazu.</p>
<p>Nur Typen, die zur Compilezeit initialisiert werden, können bereits bei der Deklaration initialisiert werden.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712131</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 18 May 2009 11:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:26:17 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Nur Typen, die zur Compilezeit initialisiert werden, können bereits bei der Deklaration initialisiert werden.</p>
</blockquote>
<p>Auch nicht alle, der Standard ist da sehr restriktiv:</p>
<p>ISO/IEC 14882, §9.4.2/4 schrieb:</p>
<blockquote>
<p>4 If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions within its scope. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1712139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712139</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 May 2009 11:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:36:18 GMT]]></title><description><![CDATA[<p>danke, das hatte ich befürchtet.<br />
(@SeppJ - in einer konsequent objektorientierten Sprache trifft das zu, offensichtlich gilt das aber nicht für C++.)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a> deine Variante benötigt eine &quot;createSomeFoo()&quot; Funktion, die ja auch irgendwo deklariert/implementiert sein muss,oder?</p>
<p>In Meinem Fall handelt es sich um eine QMap (<a href="http://doc.trolltech.com/4.5/qmap.html" rel="nofollow">http://doc.trolltech.com/4.5/qmap.html</a>) und das Objekt hat 2 Einträge. Meine createSomeFoo() Funktion sähe dann z.B. so aus?:<br />
header:<br />
...</p>
<pre><code class="language-cpp">const static QMap&lt;String,int&gt; map
</code></pre>
<p>...<br />
implementierung</p>
<pre><code class="language-cpp">...
X::createSomeFoo(){
 map[&quot;one&quot;] = 1;
 map[&quot;three&quot;] = 3;
}
</code></pre>
<p>Die Frage ist ob das geht? Ich ändere ja das Objekt 2mal - mit jeder Zuweisung?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712143</guid><dc:creator><![CDATA[dermoritz]]></dc:creator><pubDate>Mon, 18 May 2009 11:36:18 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 11:47:40 GMT]]></title><description><![CDATA[<p>dermoritz schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a> deine Variante benötigt eine &quot;createSomeFoo() Funktion, die ja auch irgendwo deklariert/implementiert sein muss,oder?&quot;</p>
</blockquote>
<p>Es muss ein Konstruktoraufruf sein, ginge also auch ohne extra Funktionen. In meinem Beispiel würde durch createSomeFoo() ein Foo erstellt, ggf. noch verändert und dann an den (Copy-)Konstruktor des statischen Memberobjekts übergeben. In deinem Fall müsste es was ähnliches sein, da es ja keinen direkten Map-Konstruktor geben wird, der genau die zwei Belegungen macht.</p>
<pre><code class="language-cpp">class X
{ 
 const static QMap&lt;String,int&gt; map; //Deklaration

private:
 static QMap&lt;String,int&gt; mapInit(); //Hilfsfunktion
};

//X.cpp
QMap&lt;String,int&gt; X::mapInit()
{
  QMap&lt;String,int&gt; tmp;
  tmp[&quot;one&quot;] = 1;
  tmp[&quot;three&quot;] = 3;
  return tmp;
}

const QMap&lt;String,int&gt; X::map(X::mapInit()); //oder mit =, Hauptsache QMap hat einen Copy-Ctor
</code></pre>
<p>edit: Du kannst natürlich auch die Memberfunktion mapInit weglassen und einfach als Funktion lokal in deiner .cpp definieren. Sie wird ja nur dort gebraucht um einmalig im Programm die statische Konstante zusammenzuschrauben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712152</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 May 2009 11:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 12:18:44 GMT]]></title><description><![CDATA[<p>erstmal: danke pumuckl.</p>
<p>aber für einen c++ noob ergeben sich weitere fragen:</p>
<p>ich würde die Variante bevorzugen, die mapInit nicht im header erwähnt - dafür muss ich den Eintrag ( static QMap&lt;String,int&gt; mapInit();) im Header einfach weglassen und in der cpp noch static davorschreiben, oder?</p>
<p>und</p>
<pre><code class="language-cpp">const QMap&lt;String,int&gt; X::map(X::mapInit());
</code></pre>
<p>kann ich irgendwo (z.b. ganz oben) in die cpp schreiben? Dieses Objekt wird dann genau einmal für alle Instanzen von X angelegt - automatisch(wann genau?)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712202</guid><dc:creator><![CDATA[dermoritz]]></dc:creator><pubDate>Mon, 18 May 2009 12:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 12:25:59 GMT]]></title><description><![CDATA[<p>dermoritz schrieb:</p>
<blockquote>
<p>ich würde die Variante bevorzugen, die mapInit nicht im header erwähnt - dafür muss ich den Eintrag ( static QMap&lt;String,int&gt; mapInit();) im Header einfach weglassen und in der cpp noch static davorschreiben, oder?</p>
</blockquote>
<p>Du müsstest außerdem die Qualifizierung als Klassenmethode weglassen, sowohl bei der Definition als auch beim Aufruf. Das static kannst du machen, musst du aber nicht. Meines Wissens hieße das nur, dass die ÜE dann kein entsprechendes Linkersymbol enthielte. Du kannst die Funktion auch in einen anonymen Namespace packen, oder sie ebene nur in der cpp ganz normal definieren.</p>
<pre><code class="language-cpp">//X.cpp

//namespace { //Variante 1
//static //Variante 2

QMap&lt;String,int&gt; mapInit()
{
  QMap&lt;String,int&gt; tmp;
  tmp[&quot;one&quot;] = 1;
  tmp[&quot;three&quot;] = 3;
  return tmp;
}

//} //end namespace

const QMap&lt;String,int&gt; X::map(mapInit());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1712209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712209</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 May 2009 12:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 13:41:15 GMT]]></title><description><![CDATA[<p>unabhängig davon wie ich die init-Funktion definiere wann und wie wird dieses</p>
<pre><code class="language-cpp">const QMap&lt;String,int&gt; X::map(mapInit());
</code></pre>
<p>ausgeführt?</p>
<p>um die Frage mal zu konkretisieren:</p>
<p>da die map staic const ist, kann ich davon ausgehen, das mapInit nur einmal ausgeführt wird und nicht einmal für jede Instanz der Klasse? Oder wird es bei jeder Instanziierung ausgeführt nur läuft dann die Zuweisung ins leere?<br />
Für letzteren Fall könnte man eine Abfrage in die Initfunktion machen, die überprüft ob map schon befüllt ist. Falls ja wird map zurückgegeben ansonsten eben initialisiert?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712227</guid><dc:creator><![CDATA[dermoritz]]></dc:creator><pubDate>Mon, 18 May 2009 13:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 13:00:33 GMT]]></title><description><![CDATA[<p>dermoritz schrieb:</p>
<blockquote>
<p>...(@SeppJ - in einer konsequent objektorientierten Sprache trifft das zu, offensichtlich gilt das aber nicht für C++.)</p>
</blockquote>
<p>Schon eher als auf Java. <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 />
Ich vermute, die Zahl der in dieser Hinsicht &quot;konsequent objektorientierten Sprachen&quot; mit nennenswerter Praxisverbreitung ist seeeeehr klein.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712230</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 18 May 2009 13:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 13:01:42 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Nur Typen, die zur Compilezeit initialisiert werden, können bereits bei der Deklaration initialisiert werden.</p>
</blockquote>
<p>Auch nicht alle, ...</p>
</blockquote>
<p>Das war mir durchaus bewusst, aber es ging mir um die Abgrenzung &quot;nach oben&quot; (also die Aussage, dass Typen, die zur Laufzeit initialisiert werden, nicht infrage kommen).</p>
<p>Aber danke für die Ergänzung.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712232</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 18 May 2009 13:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to objekt als klassenkonstante - geht das? on Mon, 18 May 2009 13:36:07 GMT]]></title><description><![CDATA[<p>dermoritz schrieb:</p>
<blockquote>
<p>unabhängig davon wie ich die init-Funktion definiere wann und wie wird dieses</p>
<pre><code class="language-cpp">const QMap&lt;String,int&gt; X::map(mapInit());
</code></pre>
<p>ausgeführt?</p>
</blockquote>
<p>IIRC garantiert der Standard nur, dass X::map initialisiert wird, bevor eine Funktion aus der selben TU aufgerufen wird. Der genaue Wortlaut ist sicher ein anderer, und es gibt einige Fallstricke:</p>
<p><a href="http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12" rel="nofollow">http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12</a></p>
<p>Die meisten Compiler machen es aber so, dass alle statischen/globalen Objekte initialisiert werden, bevor main() losläuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712244</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 18 May 2009 13:36:07 GMT</pubDate></item></channel></rss>