<?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[Initialisierung von static vector&amp;lt;string&amp;gt;]]></title><description><![CDATA[<p>Hallo,</p>
<p>für ein embedded projekt auf mips benöte ich eine Initialisierung für die statische membervariable einer klasse, genauer eine variable vom typ std::vector<a href="std::string" rel="nofollow">std::string</a>.</p>
<p>Im www habe ich bereits einige wenige Artikel dazu gefunden, die leider nicht genau das wiederspiegeln, was ich möchte. Eigentlich möchte ich nur vor dem Aufruf von main() den default konstruktor aufrufen. Aber wie?</p>
<p>Im www habe ich z.B. folgende Lösung gefunden:</p>
<pre><code>const char *var_init[]={Val_1, Val_2 Val_3};
std::vector&lt;std::string&gt; classname::varname(var_init, var_init+3); // definition
</code></pre>
<p>Das ist zwar nett, belegt aber den Vektor gleich mit Werten, die ich dort nicht haben möchte. Deswegen habe ich eine statische Memberfunktion geschrieben, die vor main() erst einmal clear() aufruft.</p>
<p>Gibt es da keine elegantere Methode, eine statische std::vector<a href="std::string" rel="nofollow">std::string</a> von vorne herein zu initialisieren?</p>
<p>Kann man in einer statischen Memberfunktion der Klasse clear() aufrufen, auch wenn die Vector-Variable noch nicht initialisiert wurde?</p>
<p>Weil es sich um ein embedded projekt handelt, scheiden Lösungen wie boost oder dergleichen leider aus.</p>
<p>Besten Dank schon mal im voraus für Lösungen</p>
<p>Gruß</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289990/initialisierung-von-static-vector-lt-string-gt</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 18:47:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289990.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jul 2011 10:53:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Sun, 17 Jul 2011 10:53:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>für ein embedded projekt auf mips benöte ich eine Initialisierung für die statische membervariable einer klasse, genauer eine variable vom typ std::vector<a href="std::string" rel="nofollow">std::string</a>.</p>
<p>Im www habe ich bereits einige wenige Artikel dazu gefunden, die leider nicht genau das wiederspiegeln, was ich möchte. Eigentlich möchte ich nur vor dem Aufruf von main() den default konstruktor aufrufen. Aber wie?</p>
<p>Im www habe ich z.B. folgende Lösung gefunden:</p>
<pre><code>const char *var_init[]={Val_1, Val_2 Val_3};
std::vector&lt;std::string&gt; classname::varname(var_init, var_init+3); // definition
</code></pre>
<p>Das ist zwar nett, belegt aber den Vektor gleich mit Werten, die ich dort nicht haben möchte. Deswegen habe ich eine statische Memberfunktion geschrieben, die vor main() erst einmal clear() aufruft.</p>
<p>Gibt es da keine elegantere Methode, eine statische std::vector<a href="std::string" rel="nofollow">std::string</a> von vorne herein zu initialisieren?</p>
<p>Kann man in einer statischen Memberfunktion der Klasse clear() aufrufen, auch wenn die Vector-Variable noch nicht initialisiert wurde?</p>
<p>Weil es sich um ein embedded projekt handelt, scheiden Lösungen wie boost oder dergleichen leider aus.</p>
<p>Besten Dank schon mal im voraus für Lösungen</p>
<p>Gruß</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093818</guid><dc:creator><![CDATA[Plumpsklo]]></dc:creator><pubDate>Sun, 17 Jul 2011 10:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Sun, 17 Jul 2011 11:19:47 GMT]]></title><description><![CDATA[<p>Du musst <code>std::vector</code> nicht mit <code>clear()</code> initialisieren. Sobald ein Container-Objekt konstruiert wird, ist es korrekt initialisiert, und zwar leer.</p>
<p>Vielleicht suchst du sowas... Aber wieso überhaupt statisch und vor <code>main()</code> initialisiert?</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt;&amp; GetVector()
{
    static std::vector&lt;std::string&gt; vector;
    return vector;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2093824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093824</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 17 Jul 2011 11:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Sun, 17 Jul 2011 18:17:09 GMT]]></title><description><![CDATA[<p>wenn du boost verwendest, dann wird einen blick auf boost::list_of. Ist zwar nicht speziell für statische vectoren, funktioniert dort aber auch einwandfrei...</p>
<p>(auch bei embedded kannst du viele boost funktionalitäten verwenden, so lang diese header only sind und nicht allzu viele Abhängigkeiten besitzen. allerdings macht es für dieses Beispiel nicht wirklich Sinn)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093960</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sun, 17 Jul 2011 18:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Sun, 17 Jul 2011 17:41:26 GMT]]></title><description><![CDATA[<p>Plumpsklo schrieb:</p>
<blockquote>
<p>Das ist zwar nett, belegt aber den Vektor gleich mit Werten, die ich dort nicht haben möchte. Deswegen habe ich eine statische Memberfunktion geschrieben, die vor main() erst einmal clear() aufruft.</p>
</blockquote>
<p>Wenn du einen leeren Vector benötigst, ist es imho sinnfrei, sich erst einen vollen Vector zu besorgen und diesen dann zu leeren. Leg doch einfach einen leeren vector an, das reicht völlig:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; classname::varname; // definition
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2093965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093965</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 17 Jul 2011 17:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Sun, 17 Jul 2011 19:09:04 GMT]]></title><description><![CDATA[<p>Soll der Vektor nach der Initialisierung später geändert werden oder ist das eine Art konstante Lookup-Tabelle? Falls letzteres, würde ich dir von std::vector und std::string abraten, da diese eine dynamische Initialisierung erfordern. Mach's so:</p>
<pre><code class="language-cpp">// Header-Datei (falls noetig)
extern const char* const table[4];

// CPP-Datei...
extern const char* const table[4] = {
  &quot;foo&quot;, &quot;bar&quot;, &quot;dies&quot;, &quot;das&quot;
};
</code></pre>
<p>Falls Du die Tabelle nur &quot;privat&quot; in einem Modul verwenden möchtest, kannst Du Dir das mit der Headerdatei und dem &quot;extern&quot; natürlich sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093996</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 17 Jul 2011 19:09:04 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 05:44:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank für die Antworten. Die Klasse soll für das Projekt die Fehlermeldungen an zentraler Stelle sammeln. Damit die Fehlerklasse sowohl abgeleitet oder auch als lokale Variable eingebunden werden kann, möchte ich <strong>keinen</strong> Singleton verwenden. Eine Singleton Lösung, mit der die Fehlerklasse die eigenen lokalen Membervariablen einbindet, würde vom Entwurf wahrscheinlich aber auch funktionieren. Mein erster Gedanke war aber, es mit einer statischen Membervariablen zu versuchen. Das Problem ist aber, daß statische Membervariable bereits existieren, bevor eine Instanz der Klasse erzeugt wird. Also muss ich mich um die Initialisierung der <strong>statischen</strong> Membervariablen selbst kümmern. Ein Zugriff auf eine nicht-initialiserte Vecor-Membervariable führt bekanntlich zum Absturz, was ich mir auch erst noch einmal in Erinnerung rufen musste.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: ich bin mir nicht sicher, dies funktionieren wird, da auch hier vecor als statische Variable händisch initialisiert werden muss, oder?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15647">@muffmolch</a>: boost scheidet in den Projekt wegen Platzmangel aus</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: bei statischen Membervariablen wird der Standard-Konstruktor nicht automatisch aufgerufen</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>: nein, es soll eine Klasse sein, die eine bestimmte Anzahl von Meldungen während der Laufzeit des Programms speichert.</p>
<p>Gruß</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094090</guid><dc:creator><![CDATA[Plumpsklo]]></dc:creator><pubDate>Mon, 18 Jul 2011 05:44:55 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 07:53:12 GMT]]></title><description><![CDATA[<p>Plumpsklo schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: bei statischen Membervariablen wird der Standard-Konstruktor nicht automatisch aufgerufen</p>
</blockquote>
<p>Doch, selbstverständlich wird er.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct A { A() { std::cout &lt;&lt; &quot;A Konstruktor\n&quot;; } };

struct B
{
    static A a;
};

A B::a;  // &lt;-- Definition

int main()
{
    std::cout &lt;&lt; &quot;Main, erste Zeile\n&quot;;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>A Konstruktor
Main, erste Zeile
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2094097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094097</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 18 Jul 2011 07:53:12 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 07:02:56 GMT]]></title><description><![CDATA[<p>Plumpsklo schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: bei statischen Membervariablen wird der Standard-Konstruktor nicht automatisch aufgerufen</p>
</blockquote>
<p>Doch, wird er!</p>
<p>edit: sorry, hatte den Post wohl etwas lange offen <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="😉"
    /> ipsec hat die ctor-Tatsache bereits berichtigt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094100</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 18 Jul 2011 07:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 08:20:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>jetzt bin ich verwirrt. Mein Programm ist abgestürzt, als ich mit einem Iterator auf ein normal deklariertes static std::vector<a href="std::string" rel="nofollow">std::string</a> zugreifen wollte. Erst der Kunstgriff mit der Pseudo-Initialisierung und dem anschließenden clear() hat funktioniert.</p>
<p>Gruß</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094129</guid><dc:creator><![CDATA[Plumpsklo]]></dc:creator><pubDate>Mon, 18 Jul 2011 08:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 08:43:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct A { A() { std::cout &lt;&lt; &quot;A Konstruktor\n&quot;; } }; 
static A a;
struct B { 	static A a;  }; 
A B::a;  // &lt;-- Definition 
static std::vector&lt; std::string &gt; testVec(2, &quot;test&quot;);

int main( int, char * )
{
	std::cout &lt;&lt; &quot;main&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; testVec.size() &lt;&lt; std::endl;
	BOOST_FOREACH( const std::string &amp; str, testVec )
		std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>liefert unter msvc 9:</p>
<pre><code>A Konstruktor
A Konstruktor
main
2
test
test
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2094137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094137</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 18 Jul 2011 08:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 08:53:37 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct A { A() { std::cout &lt;&lt; &quot;A Konstruktor\n&quot;; } }; 
static A a;
struct B { 	static A a;  }; 
A B::a;  // &lt;-- Definition 
static std::vector&lt; std::string &gt; testVec(2, &quot;test&quot;);

int main( int, char * )
{
	std::cout &lt;&lt; &quot;main&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; testVec.size() &lt;&lt; std::endl;
	BOOST_FOREACH( const std::string &amp; str, testVec )
		std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>liefert unter msvc 9:</p>
<pre><code>A Konstruktor
A Konstruktor
main
2
test
test
</code></pre>
</blockquote>
<p>GCC auch.<br />
(mecker bei &quot;int main( int, char * )&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094139</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 18 Jul 2011 08:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Mon, 18 Jul 2011 16:28:02 GMT]]></title><description><![CDATA[<p>Plumpsklo schrieb:</p>
<blockquote>
<p>vielen Dank für die Antworten. Die Klasse soll für das Projekt die Fehlermeldungen an zentraler Stelle sammeln. Damit die Fehlerklasse sowohl abgeleitet oder auch als lokale Variable eingebunden werden kann, möchte ich <strong>keinen</strong> Singleton verwenden. Eine Singleton Lösung, mit der die Fehlerklasse die eigenen lokalen Membervariablen einbindet, würde vom Entwurf wahrscheinlich aber auch funktionieren. Mein erster Gedanke war aber, es mit einer statischen Membervariablen zu versuchen. Das Problem ist aber, daß statische Membervariable bereits existieren, bevor eine Instanz der Klasse erzeugt wird. Also muss ich mich um die Initialisierung der <strong>statischen</strong> Membervariablen selbst kümmern. Ein Zugriff auf eine nicht-initialiserte Vecor-Membervariable führt bekanntlich zum Absturz, was ich mir auch erst noch einmal in Erinnerung rufen musste.</p>
</blockquote>
<p>Dir ist ein Singleton zu global (schonmal ein löblicher Ansatz), aber stattdessen verwendest du statische Member, die genauso global gültig sind? Das mußt du mir mal genauer erklären.</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: bei statischen Membervariablen wird der Standard-Konstruktor nicht automatisch aufgerufen</p>
</blockquote>
<p>Klar wird er aufgerufen, wie dir schon mehrere Nutzer bewiesen haben.<br />
Probleme kann es nur geben, wenn verschiedene globale/statische Variablen in unterschiedlichen Übersetzungseinheiten initialisierst, die voneinander abhängen. Aber dein bisheriges Beispiel sieht nicht danach aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094380</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Jul 2011 16:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Tue, 19 Jul 2011 15:59:17 GMT]]></title><description><![CDATA[<p>^^^^</p>
<p>Hallo,</p>
<p>mir ist der Sigleton nicht zu global, sondern von der Implementierung ein wenig zu unpraktisch. Sinn dieser Anwendung soll es ja gerade sein, daß unabhängig davon, wie oft und auf welche weise die Klasse benutzt wird, die vector-variable für alle Instanzen die selbe ist.</p>
<p>Leider bin ich in C++ noch nicht so firm, daher weiss ich nicht, warum</p>
<pre><code>[i] (static) [/i]std::vector&lt;std::string&gt; classname::varname; // definition
</code></pre>
<p>zu einem nicht initialisierten Vektor führt, während eine Initialisierung mit</p>
<pre><code>const char *var_init[]={Val_1, Val_2 Val_3};
[i] (static) [/i]std::vector&lt;std::string&gt; classname::varname(var_init, var_init+3); // definition
</code></pre>
<p>den Vektor korrekt initialisiert, wenngleich auch mit Werten, die ich nicht haben möchte.</p>
<p>Was müsste ich denn in die Klammern schreiben, damit der Vektor mit 0 Elementen initialisiert wird?</p>
<p>Gruß</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2094991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2094991</guid><dc:creator><![CDATA[Plumpsklo]]></dc:creator><pubDate>Tue, 19 Jul 2011 15:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung von static vector&amp;lt;string&amp;gt; on Tue, 19 Jul 2011 16:27:17 GMT]]></title><description><![CDATA[<p>Laut C++ Standard sollte auch der erste Aufruf einen komplett initialisierten vector&lt;&gt; anlegen, also läuft bei deinem Code vermutlich etwas anderes schief (auf Anhieb würde ich auf Probleme mit der Initialisierungs-Reihenfolge von globalen Objekten tippen).</p>
<p>Ansonsten lässt sich das Singleton-Konzept auch für spezielle Anforderungen variieren:</p>
<pre><code class="language-cpp">class classname
{
  static vector&lt;string&gt;&amp; log()
  {
    static vector&lt;string&gt; variable;
    return variable;
  }
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2095004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2095004</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 19 Jul 2011 16:27:17 GMT</pubDate></item></channel></rss>