<?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[Call by reference mit std::string]]></title><description><![CDATA[<p>Hallo @ all,</p>
<p>Ich habe eine Funktion</p>
<pre><code class="language-cpp">void rtrim(std::string &amp;str)
</code></pre>
<p>versuche ich diese zu Compilieren erhalten ich diesen Fehler :</p>
<pre><code>1&gt;fVString.obj : error LNK2005: &quot;void __cdecl VString::rtrim(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; &amp;)&quot; (?rtrim@VString@@YAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in HTTP_Request.obj
</code></pre>
<p>Compiliere ich jedoch die Funktion &quot;ohne Call by reference&quot; also</p>
<pre><code class="language-cpp">void rtrim(std::string str)
</code></pre>
<p>Funktioniert das ganze.</p>
<p>Mich würde interessieren warum das so ist resp. was ich falsch mache.</p>
<p>Danke schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266457/call-by-reference-mit-std-string</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 18:15:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266457.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 May 2010 13:57:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 13:57:57 GMT]]></title><description><![CDATA[<p>Hallo @ all,</p>
<p>Ich habe eine Funktion</p>
<pre><code class="language-cpp">void rtrim(std::string &amp;str)
</code></pre>
<p>versuche ich diese zu Compilieren erhalten ich diesen Fehler :</p>
<pre><code>1&gt;fVString.obj : error LNK2005: &quot;void __cdecl VString::rtrim(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; &amp;)&quot; (?rtrim@VString@@YAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in HTTP_Request.obj
</code></pre>
<p>Compiliere ich jedoch die Funktion &quot;ohne Call by reference&quot; also</p>
<pre><code class="language-cpp">void rtrim(std::string str)
</code></pre>
<p>Funktioniert das ganze.</p>
<p>Mich würde interessieren warum das so ist resp. was ich falsch mache.</p>
<p>Danke schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894658</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sun, 09 May 2010 13:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 13:59:04 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung ist: ne Funktion mit der Signatur gibt es bereits. Und zwar in HTTP_REQuest.cpp (oder.c)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894660</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 09 May 2010 13:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:04:22 GMT]]></title><description><![CDATA[<p>Was meinst du genau mit Signatur?</p>
<p>Weil die Funktion gibst definitiv nur einmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894666</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sun, 09 May 2010 14:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:09:37 GMT]]></title><description><![CDATA[<p>Er meint, dass schon irgendwo die Funktion mit selbem Namen und selbem Parameter definiert wurde. Entweder hast du eine Implementierung in der .cpp und der .h, oder du hast in dem Header keine Include-Guards.<br />
Sollte dich das nicht weiter bringen, kannst du ja mal etwas Code posten (header/.cpp mit dem VString::rtrim, und den ominösen &quot;HTTP_Request.cpp&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894667</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 09 May 2010 14:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:13:03 GMT]]></title><description><![CDATA[<p>Definierst du die Funktion zufälligerweise in einem Header, welcher dann von mehreren .cpp's inkludiert wird?<br />
Wenn ja, dann lagere die Definition in eine .cpp aus. Ansonsten zeig mal ein wenig des relevanten Code.</p>
<p>//EDIT:<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20104">@l</a>'abra d'or:<br />
Includeguards bringen in einem solchen Fall nichts. Die verhindern nur, dass ein Header in einer Übersetzungseinheit nicht 2x inkludiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894668</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 09 May 2010 14:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:20:21 GMT]]></title><description><![CDATA[<p>Also ich habe paar String-Funktionen in einen Namespace VString das ganze befindet sich in der &quot;fVString.h&quot;</p>
<pre><code class="language-cpp">#ifndef F_VSTRING_H
#define F_VSTRING_H

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

namespace VString {
... bla funktionen ...
};
#endif;
</code></pre>
<p>Ich Inkludiere &quot;fVString.h&quot; dann in &quot;HTTP_Request.cpp&quot; mehr hab ich bis jetzt nicht gemacht also ich greife noch nicht mal auf die Funktionen zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894674</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sun, 09 May 2010 14:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:21:51 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Includeguards bringen in einem solchen Fall nichts. Die verhindern nur, dass ein Header in einer Übersetzungseinheit nicht 2x inkludiert wird.</p>
</blockquote>
<p>Stimmt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894675</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 09 May 2010 14:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 14:46:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24582">@Frido</a>,<br />
Zeig mal wo und wie du die Funktion void <code>VString::rtrim(std::string&amp;)</code> definierst. Du hast mindestens ein <code>fVString.h</code> , <code>fVString.cpp</code> und <code>HTTP_Request.cpp</code> File. Die Vermutung liegt nahe, dass du die Funktion in <code>fVString.h</code> definierst, wie es bereits drakon erwähnt hat. Dann würde sie in zwei Übersetzungseinheiten, nämlich <code>fVString.cpp</code> und <code>HTTP_Request.cpp</code> definiert werden, wodurch du eine doppelte Definition hast, worüber dein Linker korrekterweise meckert.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894698</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 09 May 2010 14:46:46 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 17:51:59 GMT]]></title><description><![CDATA[<p>ah ok</p>
<p>Also jetzt geht's. Ich hatte Funktionskopf und den Code der Funktion in der &quot;fVString.h&quot; das wollte er wohl nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> habs jetzt in .h und .cpp aufgeteilt und siehe da es geht. Ich glaub ich guck mir bei Gelegenheit mal an wie Compiler und Linker arbeiten dann versteh ich den Fehler evt.</p>
<p>Danke an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894773</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sun, 09 May 2010 17:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 09 May 2010 18:15:39 GMT]]></title><description><![CDATA[<p>Frido schrieb:</p>
<blockquote>
<p>ah ok</p>
<p>Also jetzt geht's. Ich hatte Funktionskopf und den Code der Funktion in der &quot;fVString.h&quot; das wollte er wohl nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> habs jetzt in .h und .cpp aufgeteilt und siehe da es geht. Ich glaub ich guck mir bei Gelegenheit mal an wie Compiler und Linker arbeiten dann versteh ich den Fehler evt.</p>
<p>Danke an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
</blockquote>
<p>Ja. Das habe ich dir ja schon oben gesagt, dass du die trennen musst. Das es manchmal geht und manchmal nicht liegt wohl daran, dass der Compiler das geinlied hat und manchmal nicht. Dann geht das nämlich auch.</p>
<p>Der Grund ist ganz einfach. In einem C++ Programm darf man nichts 2x definieren (von dern Sonderfällen von templates usw. mal abgesehen). Du musst also die ODR (one definition rule befolgen). Wenn du jetzt aber eine Definition in einem Header hast und diesen Header dann in verschiedenen Übersetzungseinheiten (.cpp) includest, dann wird der Compiler da in beiden Fällen eigene Defintionen erstellen, welche für sich Ok sind. Wenn jetzt aber der Linker daher kommt und sieht, dass eine Funktion 2x definiert ist, dann gibt das Ärger und meldet dir den obigen Fehler.<br />
Das Verhalten ist auch verständlich, denn welche Definition soll der Linker denn nehmen, wenn verschiedene Versionen vorliegen? (das sie von dem gleichen Header kommen weiss der Linker ja nicht und daher könnten es komplett unterschiedliche Versionen sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894792</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 09 May 2010 18:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sat, 15 May 2010 21:59:11 GMT]]></title><description><![CDATA[<p>So jetzt hab ich weitergemacht und das ganze in ne Klasse gepackt jeweils als Statische Methoden.</p>
<p>Fehler ist der :</p>
<pre><code>1&gt;Debug\VString.obj : warning LNK4042: object specified more than once; extras ignored
1&gt;HTTP_Request.obj : error LNK2019: unresolved external symbol &quot;public: static void __cdecl VString::trim(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; &amp;)&quot; (?trim@VString@@SAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function &quot;public: __thiscall HTTPRequest::HTTPRequest(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt;,unsigned int)&quot; (??0HTTPRequest@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z)
1&gt;HTTP_Request.obj : error LNK2019: unresolved external symbol &quot;public: static class std::vector&lt;class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt;,class std::allocator&lt;class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; &gt; &gt; __cdecl VString::split(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; const &amp;,class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt;,int)&quot; (?split@VString@@SA?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@3@V43@H@Z) referenced in function &quot;public: __thiscall HTTPRequest::HTTPRequest(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt;,unsigned int)&quot; (??0HTTPRequest@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z)
1&gt;D:\C++\VreshAdManger\Debug\VreshAdManger.exe : fatal error LNK1120: 2 unresolved externals
</code></pre>
<p>VString.h :</p>
<pre><code class="language-cpp">#ifndef VSTRING_H
#define VSTRING_H

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

class VString {

public:

	static std::vector&lt;std::string&gt; split(const std::string &amp;delimiter,std::string str,int maxparts);

	static void rtrim(std::string &amp;str);

	static void ltrim(std::string&amp; str);

	static void trim(std::string&amp; str);

};

#endif
</code></pre>
<p>VString.cpp :</p>
<pre><code class="language-cpp">#include &quot;VString.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

vector&lt;string&gt; VString::split(const string &amp;delimiter,string str,int maxparts)
{
	vector&lt;string&gt; ret;
	if(delimiter.length() &lt; 1) {
		ret.insert(ret.end(),str);
	}
	else if(delimiter.length() == 1) {
		size_t lpos = 0;
		for(size_t i = 0;i &lt; str.length();++i)
		{	
			if(maxparts != -1 &amp;&amp; ret.size() == maxparts)	{
				ret.push_back( str.substr(lpos) );
				break;
			}
			if(str[i] == delimiter[0])	{

				ret.push_back( str.substr(lpos , (i - lpos)) );
				lpos=i+1;
			}
		}

	}
	else	{
		size_t lpos = 0;
		while(lpos != string::npos)	{
			if(maxparts != -1 &amp;&amp; ret.size() == maxparts)	{
				ret.push_back( str.substr(lpos) );
				break;
			}
			size_t tmp = 0;
			tmp=str.find(delimiter,lpos);
			ret.push_back( str.substr(lpos , ( (tmp) - lpos)) );
			lpos= (tmp == string::npos) ? string::npos : (tmp+delimiter.length()) ;
		}
	}
	//nothing splited?
	if(ret.size() == 0)
		ret.push_back(str);

	return ret;
}

void VString::rtrim(string &amp;str)	{

	for(size_t i = (str.length()-1);i &gt; 0; --i)
	{
		if(str[i] == ' ') str.erase(i);
		else break;
	}
}

void VString::ltrim(string&amp; str)	{

	for(size_t i = 0;i &lt; str.length(); ++i)
	{
		if(str[i] == ' ') str.erase(i,1);
		else break;
	}

}

void VString::trim(string&amp; str)	{
	VString::ltrim(str);
	VString::rtrim(str);
}
</code></pre>
<p>Hier wird das ganze dann Benutzt :</p>
<pre><code class="language-cpp">#include &quot;HTTP_Request.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &quot;VString.h&quot;

HTTPRequest::HTTPRequest(string raw_data,size_t len)
{
	if(raw_data.find(&quot;GET&quot;) != string::npos || raw_data.find(&quot;POST&quot;) != string::npos)	{	

		headerValid=true;
		raw_data = raw_data.substr(0,len);

		cout &lt;&lt; raw_data &lt;&lt; endl;

		vector&lt;string&gt; lines = VString::split(&quot;\r\n&quot;,raw_data,-1);

		for(size_t i = 0;i &lt; lines.size();++i)
		{
			if(lines[i].find(&quot;GET&quot;) != string::npos)	{	
				request_data.method=HTTP_METHOD_GET;
				vector&lt;string&gt; tmp = VString::split(&quot; &quot;,lines[i],-1);
				cout &lt;&lt; &quot; ===== URL =====&gt;&gt;|&quot; &lt;&lt; tmp[1] &lt;&lt; &quot;|&quot; &lt;&lt; endl;
			}
			if(lines[i].find(&quot;POST&quot;) != string::npos)	{	
				request_data.method=HTTP_METHOD_POST;
			}
			if(lines[i].find(&quot;User-Agent:&quot;) != string::npos)	{	
				vector&lt;string&gt; tmp = VString::split(&quot;:&quot;,lines[i],1);
				VString::trim(tmp[1]);
				request_data.user_agent = tmp[1];
			}
			if(lines[i].find(&quot;Accept-Encoding:&quot;) != string::npos)	{
				if(lines[i].find(&quot;gzip&quot;) != string::npos)
					request_data.supports_gzip=true;
				else
					request_data.supports_gzip=false;
			}

		}

		cout &lt;&lt; &quot;UA:&quot; &lt;&lt; request_data.user_agent &lt;&lt; endl;
		cout &lt;&lt; &quot;M:&quot; &lt;&lt; request_data.method &lt;&lt; endl;
		cout &lt;&lt; &quot;Gzip:&quot; &lt;&lt; (request_data.supports_gzip ? &quot;Yes&quot; : &quot;No&quot; ) &lt;&lt; endl;
		//request_data.

	}
	else
	{
		headerValid=false;
	}
}
</code></pre>
<p>Das tolle ist es ging alles bis ich bei VStrin::split den letzten Parameter hinzugefügt hab, also int maxparts. Ich hoffe ich hab das jetzt so einigermaßen verständlich geschildert.</p>
<p>greets Frido</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897714</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sat, 15 May 2010 21:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 16 May 2010 10:19:57 GMT]]></title><description><![CDATA[<p>Frido schrieb:</p>
<blockquote>
<p>So jetzt hab ich weitergemacht und das ganze in ne Klasse gepackt jeweils als Statische Methoden.</p>
</blockquote>
<p>Nur mal so nebenbei: Warum? Welchen Sinn macht es eine Klasse nur mit statischen Methoden zu definieren? Das macht nur in Programmiersprachen Sinn, die nichts besseres anzubieten haben. Aber in C++ gibt es Namespaces.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897798</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 16 May 2010 10:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 16 May 2010 11:48:56 GMT]]></title><description><![CDATA[<p>Ich hab das nur gemacht weil fast der selbe Linker Fehler kam als ich das in einen Namespace hatte ... da Dachte ich mir evt. geht's ja mit ner Klasse und Statischen methoden das ging dann auch bis ich wie oben erwähnt den Letzten Parameter hinzugefügt hab ...</p>
<p>greets Frido</p>
<p>Edit: Jetzt hab ich wieder in einen Namespace und siehe da kein Fehler. Aber WARUM ??? Ich versteh echt garnix mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /> Ich mein das mit den Statischen Methoden müsse doch auch gehen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Edit² : Langsam glaub ich es liegt am Linker ... wenn ich alles was im Ordner Debug ist lösche geht's :o</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897812</guid><dc:creator><![CDATA[Frido]]></dc:creator><pubDate>Sun, 16 May 2010 11:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 16 May 2010 18:32:03 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Frido schrieb:</p>
<blockquote>
<p>So jetzt hab ich weitergemacht und das ganze in ne Klasse gepackt jeweils als Statische Methoden.</p>
</blockquote>
<p>Nur mal so nebenbei: Warum? Welchen Sinn macht es eine Klasse nur mit statischen Methoden zu definieren? Das macht nur in Programmiersprachen Sinn, die nichts besseres anzubieten haben. Aber in C++ gibt es Namespaces.</p>
</blockquote>
<p>Namespaces gibt es in Java oder C# auch. Aber in C++ gibt es freie Funktionen (und Namespaces) <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/1898062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898062</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 16 May 2010 18:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Call by reference mit std::string on Sun, 16 May 2010 20:42:20 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>tntnet schrieb:</p>
<blockquote>
<p>Frido schrieb:</p>
<blockquote>
<p>So jetzt hab ich weitergemacht und das ganze in ne Klasse gepackt jeweils als Statische Methoden.</p>
</blockquote>
<p>Nur mal so nebenbei: Warum? Welchen Sinn macht es eine Klasse nur mit statischen Methoden zu definieren? Das macht nur in Programmiersprachen Sinn, die nichts besseres anzubieten haben. Aber in C++ gibt es Namespaces.</p>
</blockquote>
<p>Namespaces gibt es in Java oder C# auch. Aber in C++ gibt es freie Funktionen (und Namespaces) <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>Danke für die Korrektur. Du hast natürlich recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Frido schrieb:</p>
<blockquote>
<p>Edit: Jetzt hab ich wieder in einen Namespace und siehe da kein Fehler. Aber WARUM ??? Ich versteh echt garnix mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /> Ich mein das mit den Statischen Methoden müsse doch auch gehen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Edit² : Langsam glaub ich es liegt am Linker ... wenn ich alles was im Ordner Debug ist lösche geht's :o</p>
</blockquote>
<p>Ich versuche es mal möglichst kurz zu erklären.</p>
<p>Wenn der Compiler eine Implementierung einer Funktion sieht, dann implementiert er die Funktion halt. Die steht dann in der Objektdatei. Wenn Du 2 Source-Dateien hast, dann hast Du auch 2 Objektdateien. Und wenn Du die Funktion im Header definiert hast, dann findet der Linker sie in beiden Objektdateien. Dann kommt es zum Linkerfehler, dass die Funktion 2 mal definiert ist.</p>
<p>Wenn der Compiler im Header eine Funktionsdeklaration sieht, also eine Funktion ohne Body, dann merkt er sich erst mal einfach, dass er die Funktion braucht. Entweder der Compiler sieht die Implementierung der Funktion später oder es bleibt zunächst als unaufgelöstes Symbol in der Objektdatei. Der Linker kümmert sich dann darum, dass das Symbol gebunden wird.</p>
<p>Ein wenig anders verhält es sich, wenn eine Funktion inline definiert ist oder ein Template ist. Inlinen kann der Compiler nur, wenn er die Funktionsdefinition auch sieht. Daher muss die Funktionsdefinition gleich erfolgen. Der Compiler exportiert diese Funktion aber nicht, da er den Body ja nur zum inlinen braucht. Der Linker sieht die Funktion dann auch nicht und es kommt zu keinen Mehrfachdefinitionen.</p>
<p>Ein Template ist im Prinzip nur eine Bauanleitung für den Compiler. Auch hier wird kein externes Symbol erzeugt und daher ist es auch hier wieder kein Problem, wenn die Definition im Header erfolgt.</p>
<p>Alles klar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898122</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 16 May 2010 20:42:20 GMT</pubDate></item></channel></rss>