<?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[[Howto] Initialisierung konstanter, statischer Member-Vektoren]]></title><description><![CDATA[<p>Moin,</p>
<p>folgendes Problem: Ich habe eine Klasse, welche einen (konstanten,) statischen Vektor von Strings enthält. Dieser Vektor muss nun initialisiert werden. Zur Zeit mache ich das in etwa so:</p>
<pre><code class="language-cpp">// scanner.hpp

class Scanner {
    static std::vector&lt;std::wstring&gt; keywords;
    static bool isInitialized;
};

// scanner.cpp

bool Scanner::isInitialized = false;
vector&lt;wstring&gt; Scanner::keywords;

Scanner::Scanner(void)
{
    if(!isInitialized) {
        isInitialized = true;
        keywords.push_back(L&quot;Abstract&quot;);
        keywords.push_back(L&quot;Case&quot;);
        // ...
    }
}
</code></pre>
<p>Diese Methode hat zwei Nachteile: Der Code zur Initialisierung ist ganz schön lang (und daher in eine andere Datei ausgelagert) und 'keywords' ist nicht 'const'.</p>
<p>Meine Frage: Wäre es besser, 'keywords' als 'const' zu deklarieren und mithilfe eines C-Style-Arrays zu initialisieren?</p>
<p>Das sähe denn in etwa so aus:</p>
<pre><code class="language-cpp">class Scanner {
    static const std::wstring _keywords[] = { L&quot;Abstract&quot;, L&quot;Case&quot;, /* ... */ };
    static const int _num_keywords = 50;
    static const std::vector&lt;std::wstring&gt; keywords(&amp;_keywords[0], &amp;_keywords[_num_keywords]);
}
</code></pre>
<p>Hierbei erstellt man aber redundant Daten.</p>
<p>Was ist der bessere Stil? Gibt es noch eine (bessere) Methode, die ich übersehen habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118592/howto-initialisierung-konstanter-statischer-member-vektoren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 12:15:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118592.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Aug 2005 10:16:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:16:04 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>folgendes Problem: Ich habe eine Klasse, welche einen (konstanten,) statischen Vektor von Strings enthält. Dieser Vektor muss nun initialisiert werden. Zur Zeit mache ich das in etwa so:</p>
<pre><code class="language-cpp">// scanner.hpp

class Scanner {
    static std::vector&lt;std::wstring&gt; keywords;
    static bool isInitialized;
};

// scanner.cpp

bool Scanner::isInitialized = false;
vector&lt;wstring&gt; Scanner::keywords;

Scanner::Scanner(void)
{
    if(!isInitialized) {
        isInitialized = true;
        keywords.push_back(L&quot;Abstract&quot;);
        keywords.push_back(L&quot;Case&quot;);
        // ...
    }
}
</code></pre>
<p>Diese Methode hat zwei Nachteile: Der Code zur Initialisierung ist ganz schön lang (und daher in eine andere Datei ausgelagert) und 'keywords' ist nicht 'const'.</p>
<p>Meine Frage: Wäre es besser, 'keywords' als 'const' zu deklarieren und mithilfe eines C-Style-Arrays zu initialisieren?</p>
<p>Das sähe denn in etwa so aus:</p>
<pre><code class="language-cpp">class Scanner {
    static const std::wstring _keywords[] = { L&quot;Abstract&quot;, L&quot;Case&quot;, /* ... */ };
    static const int _num_keywords = 50;
    static const std::vector&lt;std::wstring&gt; keywords(&amp;_keywords[0], &amp;_keywords[_num_keywords]);
}
</code></pre>
<p>Hierbei erstellt man aber redundant Daten.</p>
<p>Was ist der bessere Stil? Gibt es noch eine (bessere) Methode, die ich übersehen habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855950</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:20:00 GMT]]></title><description><![CDATA[<p>Du würdest über den Satz &quot;only static const integral data can be initialized inside of a class or struct&quot; stolpern, der mir schon manches mal die Freude verdorben hat.<br />
Die Lösung ist, innerhalb der Klasse das Datenelement nur zu deklarieren und es in einer Übersetzungsheit (.cpp) dann einmalig zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855957</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:29:55 GMT]]></title><description><![CDATA[<p>Optimizer schrieb:</p>
<blockquote>
<p>Du würdest über den Satz &quot;only static const integral data can be initialized inside of a class or struct&quot; stolpern, der mir schon manches mal die Freude verdorben hat.<br />
Die Lösung ist, innerhalb der Klasse das Datenelement nur zu deklarieren und es in einer Übersetzungsheit (.cpp) dann einmalig zu definieren.</p>
</blockquote>
<p>Ok, das meinte ich. Dann sähe der alternative Code eben so aus:</p>
<pre><code class="language-cpp">// scanner.hpp

class Scanner {
    static const std::wstring _keywords[];
    static const int _num_keywords = 50;
    static const std::vector&lt;std::wstring&gt;;
}

// scanner.cpp

const wstring Scanner::_keywords[] = { L&quot;Abstract&quot;, L&quot;Case&quot;, /* ... */ };
const vector&lt;wstring&gt; Scanner::keywords(&amp;_keywords[0], &amp;_keywords[_num_keywords]);
</code></pre>
<p>Das funktioniert. Aber ist es besserer Stil als die andere Methode?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855962</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:42:11 GMT]]></title><description><![CDATA[<p>Mit Sicherheit, bei deiner Methode initialisierst du etwas statisches, also nicht Instanz-gebundenes erst, wenn du eine Instanz erstellst. Das ist IMHO ziemlich ugly und auch nicht der Sinn von statischen Membern einer Klasse. C++ kennt leider keine statischen Konstruktoren, also denke ich, ist das das beste was du machen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855971</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:46:22 GMT]]></title><description><![CDATA[<p>Ok, ich danke recht herzlich für die Antwort und werde meinen Code entsprechend anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855975</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:46:22 GMT</pubDate></item><item><title><![CDATA[Reply to [Howto] Initialisierung konstanter, statischer Member-Vektoren on Mon, 22 Aug 2005 10:48:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// scanner.hpp

class Scanner {
    static const std::vector&lt;std::wstring&gt; keywords;
};

// scanner.cpp

namespace {
  vector&lt;wstring&gt; initKeywords()
  {
    vector&lt;wstring&gt; res;
    res.push_back(L&quot;Abstract&quot;);
    res.push_back(L&quot;Case&quot;);
    // ...
    return res;
  }
}

const vector&lt;wstring&gt; Scanner::keywords = initKeywords();
</code></pre>
<p>Die Funktion kannst du ja zur Not irgendwo Richtung Dateiende implementieren oder ganz auslagern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/855977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/855977</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 22 Aug 2005 10:48:14 GMT</pubDate></item></channel></rss>