<?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[Set- und Getterfunktionen verwenden oder nicht?]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe schon des öfteren davon gelesen, und es auch in vielen Sourcecodes gesehen. Es gibt einfach keine public-Membervariablen, sondern jede von ihnen hat eine Getter- und/oder Setterfunktion.</p>
<p>Ich habe dazu ein paar Fragen.<br />
1.) Wozu genau ist das gut? Ich persönlich finde es &quot;schöner&quot;.<br />
2.) Mir macht die Geschwindigkeit &quot;sorgen&quot;. Ich weiß zwar, dass C++ verdammt schnell ist, doch können Setter- bzw. Getterfunktionen die Geschwindigkeit bei ca. 10 Aufrufen pro Sekunden deutlich beeinträchtigen?<br />
3.) Gibt es Tools, die solche Funktionen automatisch erzeugen können (bevorzugt für MSVC)?<br />
4.) Würdet ihr bei boolschen Funktionen &quot;getIsActive&quot; oder &quot;isActive&quot; benutzen?<br />
5.) Generell benutze ich C++- und Headerdateien. Würdet ihr mir empfehlen, wenn ich Getter und Setter benutze, diese direkt in die Headerdatei zu schreiben, oder dann doch auch mit in die C++-Datei?</p>
<p>Damit auch jeder versteht was ich meine, hier ein kurzes Beispiel:</p>
<pre><code class="language-cpp">class CClass
{
public:
    CClass(char *pszName, bool bActive)
    {
        this-&gt;setName(pszName);
        this-&gt;setActive(bActive);
    }
    ~CClass(void)
    {
        if (this-&gt;m_pszName)
        {
            delete[] this-&gt;m_pszName;
        }
    }

    char *getName(void)
    {
        return this-&gt;m_pszName;
    }
    bool isActive(void) // siehe Frage
    {
        return this-&gt;m_bActive;
    }
    int getNumItems(void)
    {
        return this-&gt;m_vecItems.size();
    }

    void setName(char *pszName)
    {
        if (this-&gt;m_pszName)
        {
            delete[] this-&gt;m_pszName;
            this-&gt;m_pszName = NULL;
        }

        this-&gt;m_pszName = new char[strlen(pszName) + 1]; // brauch ich das + 1 eigentlich? (ich gehe davon aus wegen dem \0)
        strcpy(this-&gt;m_pszName, pszName);
    }
    void setActive(bool bActive)
    {
        this-&gt;m_bActive = bActive;
    }

private:
    char *m_pszName;
    bool m_bActive;
    std::vector&lt;int&gt; m_vecItems;
};
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258597/set-und-getterfunktionen-verwenden-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 18:25:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258597.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jan 2010 16:07:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:09:47 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe schon des öfteren davon gelesen, und es auch in vielen Sourcecodes gesehen. Es gibt einfach keine public-Membervariablen, sondern jede von ihnen hat eine Getter- und/oder Setterfunktion.</p>
<p>Ich habe dazu ein paar Fragen.<br />
1.) Wozu genau ist das gut? Ich persönlich finde es &quot;schöner&quot;.<br />
2.) Mir macht die Geschwindigkeit &quot;sorgen&quot;. Ich weiß zwar, dass C++ verdammt schnell ist, doch können Setter- bzw. Getterfunktionen die Geschwindigkeit bei ca. 10 Aufrufen pro Sekunden deutlich beeinträchtigen?<br />
3.) Gibt es Tools, die solche Funktionen automatisch erzeugen können (bevorzugt für MSVC)?<br />
4.) Würdet ihr bei boolschen Funktionen &quot;getIsActive&quot; oder &quot;isActive&quot; benutzen?<br />
5.) Generell benutze ich C++- und Headerdateien. Würdet ihr mir empfehlen, wenn ich Getter und Setter benutze, diese direkt in die Headerdatei zu schreiben, oder dann doch auch mit in die C++-Datei?</p>
<p>Damit auch jeder versteht was ich meine, hier ein kurzes Beispiel:</p>
<pre><code class="language-cpp">class CClass
{
public:
    CClass(char *pszName, bool bActive)
    {
        this-&gt;setName(pszName);
        this-&gt;setActive(bActive);
    }
    ~CClass(void)
    {
        if (this-&gt;m_pszName)
        {
            delete[] this-&gt;m_pszName;
        }
    }

    char *getName(void)
    {
        return this-&gt;m_pszName;
    }
    bool isActive(void) // siehe Frage
    {
        return this-&gt;m_bActive;
    }
    int getNumItems(void)
    {
        return this-&gt;m_vecItems.size();
    }

    void setName(char *pszName)
    {
        if (this-&gt;m_pszName)
        {
            delete[] this-&gt;m_pszName;
            this-&gt;m_pszName = NULL;
        }

        this-&gt;m_pszName = new char[strlen(pszName) + 1]; // brauch ich das + 1 eigentlich? (ich gehe davon aus wegen dem \0)
        strcpy(this-&gt;m_pszName, pszName);
    }
    void setActive(bool bActive)
    {
        this-&gt;m_bActive = bActive;
    }

private:
    char *m_pszName;
    bool m_bActive;
    std::vector&lt;int&gt; m_vecItems;
};
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837660</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:19:41 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Wenn du Member public machst, kannst du gleich C Programmieren mit Structs <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 />
Du hast einfach Kontrolle, du kannst die zu setzende Variable in dem setter prüfen, ob sie bestimmte Kriterien erfüllt.<br />
Dann hast du bei multithreaded-Anwendungen nur über setter/getter die Möglichkeit zu synchronisieren! Bei public-Membern ist das nicht so einfach.<br />
und sicher gibt es noch viele andere Argumente.</p>
</li>
<li>
<p>10 Aufrufe/sec? Du scherzt, oder? <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>
</li>
<li>
<p>Sicher gibt es sowas wie Klassenwizards. Und Tools um neue Member samt getter + setter hinzuzufügen. Aber generiert werden da ja effektiv max. 7 Zeilen, die sind auch gleich per Hand geschrieben.</p>
</li>
<li>
<p>Wenn du die getter + setter im Header stehen hast, und die nicht sehr lange sind, wird die dein Compiler recht wahrscheinlich inlinen. Keine Ahnung ob das alle Compiler auch selber hinkriegen, wenn die Definition in einer separaten Datei (*.cpp) liegt.</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1837671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837671</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:20:44 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ich habe dazu ein paar Fragen.<br />
1.) Wozu genau ist das gut? Ich persönlich finde es &quot;schöner&quot;.</p>
</blockquote>
<p>Das ist eigentlich zu nichts gut. Für jede Variable einen Getter/Setter zu schreiben ist etwas das Leute tun, die mal was von Objektorientierung und Kapselung gehört, aber nicht verstanden haben. Im Prinzip macht man das Konzept damit nämlich wieder kaputt. Guter Stil wäre es, sinnvolle Methoden zur Manipulation eines Objekts anzubieten, anstatt alle Variablen einzeln veränderbar zu machen.</p>
<blockquote>
<p>2.) Mir macht die Geschwindigkeit &quot;sorgen&quot;. Ich weiß zwar, dass C++ verdammt schnell ist, doch können Setter- bzw. Getterfunktionen die Geschwindigkeit bei ca. 10 Aufrufen pro Sekunden deutlich beeinträchtigen?</p>
</blockquote>
<p>Oho, 10 Aufrufe pro Sekunde. Ich glaube da hat selbst die Zuse Z5 mehr geschafft.</p>
<p>So kurze Funktionen werden garantiert inline gemacht, da verliert man nichts.</p>
<blockquote>
<p>5.) Generell benutze ich C++- und Headerdateien. Würdet ihr mir empfehlen, wenn ich Getter und Setter benutze, diese direkt in die Headerdatei zu schreiben, oder dann doch auch mit in die C++-Datei?</p>
</blockquote>
<p>In den Header, dann klappt das noch eher mit dem inline.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837672</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:20:44 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:34:14 GMT]]></title><description><![CDATA[<p>Hi.<br />
Danke für die Antworten!</p>
<blockquote>
<p>Oho, 10 Aufrufe pro Sekunde. Ich glaube da hat selbst die Zuse Z5 mehr geschafft.</p>
</blockquote>
<p>Ich mach mir immer zu viele Gedanken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<blockquote>
<p>In den Header, dann klappt das noch eher mit dem inline.</p>
</blockquote>
<p>Ok. Könnte ein zusätzliches &quot;inline&quot; da noch mehr bewirken / ich mir sicher sein, dass es wirklich inline wird?</p>
<p><strong>Noch einmal ausschweifend:</strong> Inline-Funktionen werden also vom Compiler direkt in den Code kompiliert? Dann müsste das hier zum Beispiel:</p>
<pre><code class="language-cpp">inline CClass *CClassManager::getClass(char *pszName)
{
    CClass *pClass = NULL;
    // iterieren, etc...
    return pClass;
}

CClass *pClass = pClassManager-&gt;getClass(&quot;aaa&quot;);
</code></pre>
<p>zu folgendem werden (Compilerintern):</p>
<pre><code class="language-cpp">CClass *pCompilerOptimizedClass = NULL;
// iterieren, etc...
CClass *pClass = pCompilerOptimizedClass;
</code></pre>
<p>Vorteile:<br />
- schneller?<br />
Nachteile:<br />
- Compilen langsamer da mehr Code entsteht</p>
<p>Also kann man abschließend sagen, dass inline-Funktionen &quot;quasi&quot; C++-ische Makros sind? (also vom Prinzip her ^^)</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837679</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:41:04 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Also kann man abschließend sagen, dass inline-Funktionen &quot;quasi&quot; C++-ische Makros sind? (also vom Prinzip her ^^)</p>
</blockquote>
<p>So quasi also vom Prinzip her ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837682</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:44:37 GMT]]></title><description><![CDATA[<p>Ok, danke. Sorry falls ich mich etwas komisch ausdrücke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837686</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:49:49 GMT]]></title><description><![CDATA[<p>Ich hasse getter/setter aus stilgründen und versuche sie eigentlich prinzipiell zu vermeiden.<br />
Jedenfalls, es gibt bei einem inline getter keinen Unterschied zu einer normalen zuweisung; es entfällt natürlich der sprung zur Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837691</guid><dc:creator><![CDATA[Kontrasubjekt]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 16:59:22 GMT]]></title><description><![CDATA[<p>Gut, ich werde mir überlegen wie ich das mache - nur eins ist klar: Wenn, dann mache ich es durchgängig, denn das schlimmste ist es (m.M.n.) wenn man sein Stil (zumindest für ein Projekt) nicht beibehält!</p>
<p>Wäre cool wenn mir noch jemand meine &quot;Vermutung&quot; von Zeile 37/38 erklären/bestätigen könnte.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837698</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 16:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:06:40 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Wäre cool wenn mir noch jemand meine &quot;Vermutung&quot; von Zeile 37/38 erklären/bestätigen könnte.</p>
</blockquote>
<p>Ja, du brauchst das +1, wenn du mit Cstrings arbeitest. Und nein: Arbeite bloß nicht mit Cstrings, nimm stattdessen std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837706</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:11:50 GMT]]></title><description><![CDATA[<p>Kommen wir also wieder zur Geschwindigkeit. Es MUSS doch so sein dass std::string langsamer ist als C-Strings oder nicht?! Gibt es da nicht außerdem nen fetten Overhead wegen Templates, usw...? Ich benutze nämlich verdammt viele Strings <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f636.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_without_mouth"
      title=":X"
      alt="😶"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837709</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:15:06 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Kommen wir also wieder zur Geschwindigkeit. Es MUSS doch so sein dass std::string langsamer ist als C-Strings oder nicht?! Gibt es da nicht außerdem nen fetten Overhead wegen Templates, usw...? Ich benutze nämlich verdammt viele Strings <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f636.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_without_mouth"
      title=":X"
      alt="😶"
    /></p>
<p>Gruß</p>
</blockquote>
<p>Klar hat <code>std::string</code> einen gewissen Overhead gegenüber C-Strings, aber wenn du anfängst C-Strings angenehm benutzbar zu machen, landest du bei so etwas, wie <code>std::string</code> . Und meistens ist der Einsatz von strings eh nicht dort, wo hochperformanter Code gebraucht wird. Also kann man sich das durchaus zugunsten der Flexibilität, Erweiterbarkeit usw. gönnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837712</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:15:31 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Kommen wir also wieder zur Geschwindigkeit. Es MUSS doch so sein dass std::string langsamer ist als C-Strings oder nicht?! Gibt es da nicht außerdem nen fetten Overhead wegen Templates, usw...? Ich benutze nämlich verdammt viele Strings <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f636.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_without_mouth"
      title=":X"
      alt="😶"
    /></p>
<p>Gruß</p>
</blockquote>
<p>Und wo ist deiner Meinung nach der Zusammenhang zwischen Templates und Geschwindigkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837713</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:15:31 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:46:37 GMT]]></title><description><![CDATA[<p>Der &quot;fette&quot; Template-Overhead macht sich höchstens zur Kompilierzeit bemerkbar, aber da müsstest du schon große Metaprogramme gebaut haben, um das zu merken. std::string ist für die allermeisten Fälle schnell und klein genug. In der Standardbibliothek brauchst du keine Performancebremsen zu suchen. <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/1837726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837726</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 17:55:19 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Es MUSS doch so sein dass std::string langsamer ist als C-Strings oder nicht?!</p>
</blockquote>
<p>Sag mal, warum du glaubst, dass <code>std::string</code> langsamer ist als eine <strong>äquivalente</strong> Lösung mit C-Strings (eine, welche die selbe Flexibilität bietet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837736</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 12 Jan 2010 17:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:03:17 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ok - das mögen Denkfehler sein aber irgendwie geht das aus meinem Hirn nicht so recht raus. Ich denke mir immer, dass ich in den meisten Fällen eh nur strcpy, strstr, strcat und strcmp benutze. Die std::string-Klasse bietet allerdings viel viel mehr Funktionen die ich nie brauche. Und die Funktionen, die ich nicht brauche, werden pro Instanz dann doch als Overhead erstellt obwohl sie es gar nicht müssten.</p>
<p>Ein anderer Grund für mich ist es, dass das SDK das ich benutze (Source SDK von VALVe) ebenfalls NUR mit char* (bzw. const char*) arbeitet. Eine ewige hin- und her-konvertiererei zwischen std::string und char* bleibt mir somit erspart.</p>
<p>Edit: Beispiel. Wie sollte man das mit std::string machen?</p>
<pre><code class="language-cpp">//Prototype der SDK-Funktion
void getModDir(char **pszDir);

//Aufruf mit C-String
getModDir(&amp;pszString);

//Aufruf mit std::string
getModDir(&amp;stdString); // ??
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837743</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:07:37 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ok - das mögen Denkfehler sein aber irgendwie geht das aus meinem Hirn nicht so recht raus. Ich denke mir immer, dass ich in den meisten Fällen eh nur strcpy, strstr, strcat und strcmp benutze. Die std::string-Klasse bietet allerdings viel viel mehr Funktionen die ich nie brauche. Und die Funktionen, die ich nicht brauche, werden pro Instanz dann doch als Overhead erstellt obwohl sie es gar nicht müssten.</p>
</blockquote>
<p>Ohje, völlig falsch. Die Funktionen werden nicht in den Instanzen abgelegt. Im Wesentlichen ist ein Aufruf wie meinString.length() nur eine andere Schreibweise für so etwas wie string_length(&amp;meinString).<br />
Ein klein wenig Overhead gibt es bei virtuellen Funktionen, aber das brauch ich dir hier nicht zu erzählen, string hat nämlich nur nicht-virtuelle Funktionen.</p>
<blockquote>
<p>Ein anderer Grund für mich ist es, dass das SDK das ich benutze (Source SDK von VALVe) ebenfalls NUR mit char* (bzw. const char*) arbeitet. Eine ewige hin- und her-konvertiererei zwischen std::string und char* bleibt mir somit erspart.</p>
</blockquote>
<p><strong>Das</strong> kann ein Grund sein. Der richtige Weg wäre vielleicht eine für diesen Fall angepasste String-Klasse zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837748</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:07:37 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:10:56 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Hi.<br />
Ok - das mögen Denkfehler sein aber irgendwie geht das aus meinem Hirn nicht so recht raus. Ich denke mir immer, dass ich in den meisten Fällen eh nur strcpy, strstr, strcat und strcmp benutze. Die std::string-Klasse bietet allerdings viel viel mehr Funktionen die ich nie brauche. Und die Funktionen, die ich nicht brauche, werden pro Instanz dann doch als Overhead erstellt obwohl sie es gar nicht müssten.</p>
</blockquote>
<p>Nein. std::string speichert als &quot;Overhead&quot; nur die Länge. Das ist 1 int mehr als bei char*. Dafür braucht's ein char weniger, weil die Nullterminierung entfällt. Dafür laufen dann auch Funktionen die die Länge benötigen schneller.</p>
<blockquote>
<p>Ein anderer Grund für mich ist es, dass das SDK das ich benutze (Source SDK von VALVe) ebenfalls NUR mit char* (bzw. const char*) arbeitet. Eine ewige hin- und her-konvertiererei zwischen std::string und char* bleibt mir somit erspart.</p>
<p>Edit: Beispiel. Wie sollte man das mit std::string machen?</p>
<pre><code class="language-cpp">//Prototype der SDK-Funktion
void getModDir(char **pszDir);

//Aufruf mit C-String
getModDir(&amp;pszString);

//Aufruf mit std::string
getModDir(&amp;stdString); // ??
</code></pre>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837752</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:15:58 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>Edit: Beispiel. Wie sollte man das mit std::string machen?</p>
<pre><code class="language-cpp">//Prototype der SDK-Funktion
void getModDir(char **pszDir);

//Aufruf mit C-String
getModDir(&amp;pszString);

//Aufruf mit std::string
getModDir(&amp;stdString); // ??
</code></pre>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
</blockquote>
<p><code>getModDir(&amp;meinString.c_str());</code> ? Nicht so prickelnd. Man hat hier keine Chance, als den String in einen std::string umzukopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837757</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:16:09 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ok - das mögen Denkfehler sein aber irgendwie geht das aus meinem Hirn nicht so recht raus. Ich denke mir immer, dass ich in den meisten Fällen eh nur strcpy, strstr, strcat und strcmp benutze. Die std::string-Klasse bietet allerdings viel viel mehr Funktionen die ich nie brauche. Und die Funktionen, die ich nicht brauche, werden pro Instanz dann doch als Overhead erstellt obwohl sie es gar nicht müssten.</p>
</blockquote>
<p>Ohje, völlig falsch. Die Funktionen werden nicht in den Instanzen abgelegt. Im Wesentlichen ist ein Aufruf wie meinString.length() nur eine andere Schreibweise für so etwas wie string_length(&amp;meinString).</p>
</blockquote>
<p>Und wenn wir zu einem C-String gehen, dann muss für das count richtig was gemacht werden und nicht nur ein Wert zurückgegeben werden. Also muss man sich einfach überlegen, was man eher braucht. Speicher oder Speed beim zählen..</p>
<p>Einen C-String erhälst du, wie auch schon genannt mit der Memberfunktion <code>c_str()</code> .</p>
<p>Ich bezweifle aber stark, dass es bei dir wirklich einen Performance Unterschied macht, ob du <code>std::string</code> oder einen C-String benutzt..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837758</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:18:11 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Und die Funktionen, die ich nicht brauche, werden pro Instanz dann doch als Overhead erstellt obwohl sie es gar nicht müssten.</p>
</blockquote>
<p>Genau hier liegt dein Denkfehler. Funktionen werden weder pro Instanz erstellt, noch werden sie gelinkt, wenn sie nicht gebraucht werden. Bei Templates werden sie nicht mal kompiliert.</p>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ein anderer Grund für mich ist es, dass das SDK das ich benutze (Source SDK von VALVe) ebenfalls NUR mit char* (bzw. const char*) arbeitet. Eine ewige hin- und her-konvertiererei zwischen std::string und char* bleibt mir somit erspart.</p>
</blockquote>
<p>Du meinst, weil andere Bibliotheken kein modernes C++ benutzen, ist das ein Grund, es selbst nicht zu tun? Die Konvertierung ist ja wirklich sehr einfach (Konstruktor oder <code>c_str()</code> ). Wenn du hingegen ein <code>char</code> -Array kopieren willst, musst du 1. die Grösse der Quelle bestimmen, 2. Speicher anfordern, 3. Zeichen für Zeichen rüberkopieren und 4. wieder daran denken, den Speicher nach der Benutzung freizugeben. Das kann schnell mühsam werden, wenn eine Funktion zum Beispiel einen String zurückgeben soll und nicht mehr klar ist, wer für die Freigabe verantwortlich ist. Oder falls Exceptions im Spiel sind. Glaub mir, du handelst dir damit Unmengen Probleme aus C ein, welche durch C++-Techniken wie RAII beseitigt werden.</p>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>Edit: Beispiel. Wie sollte man das mit std::string machen?</p>
<pre><code class="language-cpp">//Prototype der SDK-Funktion
void getModDir(char **pszDir);
</code></pre>
</blockquote>
<p>Das geht nicht direkt, weil du einen Zeiger auf einen Zeiger (übrigens auch etwas, das man in C++ fast nie braucht) hast. Aber du hast Glück, dass dieses Problem schon mal aufgetaucht ist und ich den Thread wiedergefunden habe. <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1814408.html" rel="nofollow">Hier</a> wäre eine Klasse, die das kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837761</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 18:46:14 GMT]]></title><description><![CDATA[<p>Die verlinkte Klasse ist unter Umständen nicht ideal, da sie für Konvertierungen jeweils umkopiert. Sie ist darauf ausgelegt, dass man selbst einen Container mit Strings (in jenem Fall <code>std::vector&lt;std::string&gt;</code> ) besitzt, der <strong>selten</strong> einer Schnittstelle mit <code>char**</code> genügen muss.</p>
<p>Allerdings habe ich in diesem Thread auch geschrieben, dass die Klasse bei Bedarf erweitert werden sollte. Sie bietet bereits ein Fundament, um Konvertierungen zu ermöglichen. Weitere Funktionalität muss man sich selbst implementieren, was aber aufgrund des unterliegenden STL-Containers nicht viel mehr Aufwand als ein Funktionsaufruf bedeutet.</p>
<p>Das Wichtigste ist meiner Meinung nach – egal, was für eine Lösung du schlussendlich benutzt – dass fehleranfällige Low-Level-Operationen wie manuelle Speicherverwaltung innerhalb einer Klasse gekapselt sind, sodass der Benutzer sich wirklich wichtigen Dingen zuwenden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837783</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 12 Jan 2010 18:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 19:28:54 GMT]]></title><description><![CDATA[<p>Festzuhalten bleibt in jedem Fall, dass es Fälle gibt, in denen std::string nicht die ideale Lösung ist. Genau das sind die Fälle, in denen in der Praxis Pointer auf C-Strings oder schlechte Eigenbaulösungen verwendet werden.<br />
Oder vielleicht auch gute Eigenbaulösungen, der Vollständigkeit halber. Eigentlich kann es sowas kaum geben, weil man idealerweise ein std::string-kompatibles Interface haben möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837819</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 12 Jan 2010 19:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 20:15:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void MyClass::parse(const std::string&amp; fileName)
{
    std::ifstream stream( fileName.c_str() );
    ////
}

MyClass class;
class.parse( &quot;Hello.txt&quot; );
</code></pre>
<p>ist einer der Fälle, in denen man leicht auf std::string verzichten kann, denn es wird ein std::string-Objekt erzeugt, nur um auf den c_str zuzugreifen.<br />
Sobald aber die parse-Funktion den fileName nicht direkt verwendet, sondern z.B. in einem Daten-Verzeichnis nach einer Datei mit dem Namen sucht und zur Pfad-Zusammensetzung string-Operationen durchgeführt werden, kann sich der std::string schon wieder lohnen.</p>
<p>Also, const char* nicht gleich verteufeln, es gibt (eben auch in der Standard-Bibliothek) genügend Verwendungsmöglichkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837846</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 12 Jan 2010 20:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 20:22:16 GMT]]></title><description><![CDATA[<p>Ja, klar hier für das elleinige übergeben macht es nicht viel Sinn, aber bereits in C++0x wirds/sollte es dann auch Konstuktoren für <code>std::string</code> geben. Und dann ist es durchaus angenehmer, wenn man gleich einen <code>std::string</code> vorliegen hat, weil keine Umwandlungen mehr nötig sind.</p>
<p>Klar gibt es Verwendungsmöglichkeiten für C-Strings, aber die sind nicht da, wo man dann einen <code>std::string</code> nachbaut.<br />
Obwohl.. Mir fällt kein richtig gutes Argument/Anwendungsgebiet wo C-Strings <code>std::string</code> wirklich überlegen sind ein, abgesehen von alten Schnittstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837851</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 12 Jan 2010 20:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 21:18:24 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das ist 1 int mehr als bei char*. Dafür braucht's ein char weniger, weil die Nullterminierung entfällt.</p>
</blockquote>
<p>Nicht ganz. Das ist 1 size_t mehr, welches auf 64 bit Systemen einem uint64_t entspricht <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>
<p>Also 1 Byte vs 8 Byte.</p>
<p>Wer allerdings bei Stringverkettungen nicht zuviel Performance verlieren möchte, sollte wie bei C Strings den benötigten Speicherbedarf errechnen/schätzen und dann via reserve() genügend reservieren.</p>
<pre><code class="language-cpp">void MyClass::parse(const std::string&amp; fileName)
{
    std::ifstream stream( fileName.c_str() );
    ////
}

MyClass class;
class.parse( &quot;Hello.txt&quot; );
</code></pre>
<p>Oh je, solche Dinger sind ECHTE Performancefresser. Mit echte meine ich ECHTE.<br />
Bitte so schreiben:</p>
<pre><code class="language-cpp">void MyClass::parse(const std::string&amp; fileName)
{
    std::ifstream stream( fileName.c_str() );
    ////
}

MyClass class;
static const std::string halloString = &quot;Hello.txt&quot;;
class.parse( halloString );
</code></pre>
<p>std::string Referenzen niemals mit statischen c-strings füttern <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>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837876</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Tue, 12 Jan 2010 21:18:24 GMT</pubDate></item><item><title><![CDATA[Reply to Set- und Getterfunktionen verwenden oder nicht? on Tue, 12 Jan 2010 21:54:45 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; std::string Referenzen niemals mit statischen c-strings füttern <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>
</blockquote>
<p>Und warum bitte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837898</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 12 Jan 2010 21:54:45 GMT</pubDate></item></channel></rss>