<?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[string in const char*]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Eine Klasse bekommt einen String. Intern soll dieser in ein char[] konvertiert werden, weil ich auf den einzelnen chars operiere und sicher sein muss, dass jedes Zeichen 8 Bit lang ist. Nun habe ich sowas:</p>
<pre><code class="language-cpp">class foo {

	private:
		char* string_as_char;
	public:
		void get_String(string str) {string_as_char = str.c_str();}
};
</code></pre>
<p>Das schmeißt der Compiler mir natürlich um die Ohren. Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.</p>
<p>Was soll ich am besten tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322294/string-in-const-char</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 10:29:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322294.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Dec 2013 09:54:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 09:54:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Eine Klasse bekommt einen String. Intern soll dieser in ein char[] konvertiert werden, weil ich auf den einzelnen chars operiere und sicher sein muss, dass jedes Zeichen 8 Bit lang ist. Nun habe ich sowas:</p>
<pre><code class="language-cpp">class foo {

	private:
		char* string_as_char;
	public:
		void get_String(string str) {string_as_char = str.c_str();}
};
</code></pre>
<p>Das schmeißt der Compiler mir natürlich um die Ohren. Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.</p>
<p>Was soll ich am besten tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371765</guid><dc:creator><![CDATA[samstagmorgen]]></dc:creator><pubDate>Sat, 14 Dec 2013 09:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 10:00:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.</p>
</blockquote>
<p>Falsch. Das <code>const</code> bezieht sich auf den Pointee, nicht auf den Zeiger.</p>
<blockquote>
<p>Was soll ich am besten tun?</p>
</blockquote>
<p>Intern einen <code>std::string</code> halten. Anders geht es nicht, weil du so oder so irgendwie den Speicher managen musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371766</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 14 Dec 2013 10:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 10:59:20 GMT]]></title><description><![CDATA[<p>Ein std::string besteht aus char. Wenn die also 8 Bit haben, hat der string sie auch. Deine Begründung ist damit hinfällig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371773</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 14 Dec 2013 10:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:33:31 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.</p>
</blockquote>
<p>Falsch. Das <code>const</code> bezieht sich auf den Pointee, nicht auf den Zeiger.</p>
<blockquote></blockquote>
<p>Ah, ok. Verstehe!</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Was soll ich am besten tun?</p>
</blockquote>
<p>Intern einen <code>std::string</code> halten. Anders geht es nicht, weil du so oder so irgendwie den Speicher managen musst.</p>
</blockquote>
<p>Mmh..anscheinend funktioniert es doch anders. Da sich ja const eben auf den Pointee bezieht, kann ich doch</p>
<pre><code class="language-cpp">const char* bar = foo.c_str();
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371787</guid><dc:creator><![CDATA[samstagmorgen]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:43:03 GMT]]></title><description><![CDATA[<p>samstagmorgen schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.</p>
</blockquote>
<p>Falsch. Das <code>const</code> bezieht sich auf den Pointee, nicht auf den Zeiger.</p>
<blockquote></blockquote>
<p>Ah, ok. Verstehe!</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Was soll ich am besten tun?</p>
</blockquote>
<p>Intern einen <code>std::string</code> halten. Anders geht es nicht, weil du so oder so irgendwie den Speicher managen musst.</p>
</blockquote>
<p>Mmh..anscheinend funktioniert es doch anders. Da sich ja const eben auf den Pointee bezieht, kann ich doch</p>
<pre><code class="language-cpp">const char* bar = foo.c_str();
</code></pre>
<p>schreiben.</p>
</blockquote>
<p>ja kannst du auch:</p>
<pre><code>#include &lt;string&gt;
class Foo
{  
	char const* CString; 
public: 
	void SetString(std::string Data)
	{
		CString = Data.c_str();
	}
};
int main()
{
	Foo Bar;
	std::string MyStr = &quot;Hello there!&quot;;
	Bar.SetString(MyStr);
}
</code></pre>
<p><a href="http://ideone.com/9wBuQK" rel="nofollow">http://ideone.com/9wBuQK</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371788</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:46:28 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<pre><code>#include &lt;string&gt;
class Foo
{  
	char const* CString; 
public: 
	void SetString(std::string Data)
	{
		CString = Data.c_str();
	}
};
int main()
{
	Foo Bar;
	std::string MyStr = &quot;Hello there!&quot;;
	Bar.SetString(MyStr);
}
</code></pre>
<p><a href="http://ideone.com/9wBuQK" rel="nofollow">http://ideone.com/9wBuQK</a></p>
</blockquote>
<p>Das ist ein Musterbeispiel dafür, dass man besser std::string als Member halten sollte. Dein Code hat nämlich einen ganz subtilen Bug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371789</guid><dc:creator><![CDATA[subtilebug]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:46:28 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:48:54 GMT]]></title><description><![CDATA[<p>subtilebug schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<pre><code>#include &lt;string&gt;
class Foo
{  
	char const* CString; 
public: 
	void SetString(std::string Data)
	{
		CString = Data.c_str();
	}
};
int main()
{
	Foo Bar;
	std::string MyStr = &quot;Hello there!&quot;;
	Bar.SetString(MyStr);
}
</code></pre>
<p><a href="http://ideone.com/9wBuQK" rel="nofollow">http://ideone.com/9wBuQK</a></p>
</blockquote>
<p>Das ist ein Musterbeispiel dafür, dass man besser std::string als Member halten sollte. Dein Code hat nämlich einen ganz subtilen Bug.</p>
</blockquote>
<p>dass der cstring ungütlig wird? ja das ist mir natürlich klar. es ging mir nur darum zu beweisen, dass sich das const auf den pointee und nicht auf den pointer bezog.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371790</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:58:14 GMT]]></title><description><![CDATA[<p>Ich sehe den Bug nicht? Warum sollte CString ungültig werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371792</guid><dc:creator><![CDATA[samstagmorgen]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 12:59:41 GMT]]></title><description><![CDATA[<p>samstagmorgen schrieb:</p>
<blockquote>
<p>Ich sehe den Bug nicht? Warum sollte CString ungültig werden?</p>
</blockquote>
<blockquote>
<p>The pointer returned may be invalidated by further calls to other member functions that modify the object.</p>
</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/2371793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371793</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 14 Dec 2013 12:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 13:06:37 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>The pointer returned may be invalidated by further calls to other member functions that modify the object.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Insbesondere, wenn wie hier der Destruktor gerufen wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371794</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 14 Dec 2013 13:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 13:08:59 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>The pointer returned may be invalidated by further calls to other member functions that modify the object.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Insbesondere, wenn wie hier der Destruktor gerufen wird...</p>
</blockquote>
<p>ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371795</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 14 Dec 2013 13:08:59 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 13:27:23 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Caligulaminus schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>The pointer returned may be invalidated by further calls to other member functions that modify the object.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Insbesondere, wenn wie hier der Destruktor gerufen wird...</p>
</blockquote>
<p>ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).</p>
</blockquote>
<p>Wie würdest du dem Anwender erklären, wie er diese Funktion aufrufen soll? &quot;du darfst einen string benutzen, aber du darfst danach keine andere Aktion mit dem string mehr machen, insbesondere muss er immer gültig bleiben&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371800</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 14 Dec 2013 13:27:23 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 13:31:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>Caligulaminus schrieb:</p>
<blockquote>
<p>asfdlol schrieb:</p>
<blockquote>
<p>The pointer returned may be invalidated by further calls to other member functions that modify the object.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Insbesondere, wenn wie hier der Destruktor gerufen wird...</p>
</blockquote>
<p>ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).</p>
</blockquote>
<p>Wie würdest du dem Anwender erklären, wie er diese Funktion aufrufen soll? &quot;du darfst einen string benutzen, aber du darfst danach keine andere Aktion mit dem string mehr machen, insbesondere muss er immer gültig bleiben&quot;?</p>
</blockquote>
<p>ich habe ja nie die variante befürwortet, dass er sich einen cstring speichern soll. ich hab ihm lediglich gezeigt, wie das gehen würde (damit das missverständnis mit const aus der welt geräumt ist) und auf Caligulaminus hin habe ich hinzugefügt, dass es nicht hübsch ist, den string als value zu übergeben. ich selbst würde natürlich auch einfach einen string in die klasse tun, denn meiner meinung nach sind cstrings zeiger und keine zeichenketten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371801</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 14 Dec 2013 13:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to string in const char* on Sat, 14 Dec 2013 13:36:31 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>ich habe ja nie die variante befürwortet, dass er sich einen cstring speichern soll. ich hab ihm lediglich gezeigt, wie das gehen würde (damit das missverständnis mit const aus der welt geräumt ist) und auf Caligulaminus hin habe ich hinzugefügt, dass es nicht hübsch ist, den string als value zu übergeben. ich selbst würde natürlich auch einfach einen string in die klasse tun, denn meiner meinung nach sind cstrings zeiger und keine zeichenketten.</p>
</blockquote>
<p>Ist mir schon klar. Ich mein ja auch nur, dass selbst diese Variante zeigt, wieso man das nicht so machen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2371802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2371802</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 14 Dec 2013 13:36:31 GMT</pubDate></item></channel></rss>