<?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[Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück...]]></title><description><![CDATA[<p>Hallöle,</p>
<p>ich bin gerade dabei, zu versuchen, wieder einmal ernsthaft in C++ einzusteigen. Ich habe durchaus umfangreiche Vorkenntnisse in C und Java, deshalb dachte ich eigentlich nicht, dass ich mit den Anfängen große Probleme bekomme, aber naja... man kann sich täuschen. <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>Ich habe eine HalloWelt-Klasse geschrieben (anfangs in getrennten Dateien, mittlerweile in einer, damit es Foren-freundlicher zum Posten ist). Den Quellcode seht ihr unten. Das Problem: Ich möchte den &lt;&lt;-Operator überladen! Leider gibt mir dieser allerdings nur die Adresse auf den String aus, nicht aber den Inhalt. Dabei wüsste ich nicht, was ich falsch gemacht habe! In Google finde ich keine brauchbaren Hinweise...</p>
<p>Ich habe es auf g++ 4.4.3 Ubuntu und auf g++ 4.0.1 Apple, Inc probiert, beide haben den selben, eben beschriebenen Fehler.</p>
<p>Gruß, Micha</p>
<p>Quellcode:</p>
<pre><code class="language-cpp">#ifndef MyProgramm
#define MyProgramm

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

using namespace std;
class HalloWelt {
	public:
		HalloWelt(const string t); 
		friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp;, HalloWelt&amp;);
	private:
		std::string text;
};

HalloWelt::HalloWelt(const string t) {
	text.assign(t);
}

std::ostream&amp; operator&lt;&lt; (std::ostream&amp; out,HalloWelt&amp; hw) {
	return out &lt;&lt; hw.text;
}

int main (int argc, char** argv) {
	HalloWelt* hallowelt = new HalloWelt(&quot;hi\n&quot;);
	cout &lt;&lt; hallowelt &lt;&lt; endl;
	return 0;
}
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/286992/überladen-von-lt-lt-gibt-adresse-von-string-statt-string-zurück</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 15:31:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286992.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 May 2011 20:19:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 20:19:19 GMT]]></title><description><![CDATA[<p>Hallöle,</p>
<p>ich bin gerade dabei, zu versuchen, wieder einmal ernsthaft in C++ einzusteigen. Ich habe durchaus umfangreiche Vorkenntnisse in C und Java, deshalb dachte ich eigentlich nicht, dass ich mit den Anfängen große Probleme bekomme, aber naja... man kann sich täuschen. <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>Ich habe eine HalloWelt-Klasse geschrieben (anfangs in getrennten Dateien, mittlerweile in einer, damit es Foren-freundlicher zum Posten ist). Den Quellcode seht ihr unten. Das Problem: Ich möchte den &lt;&lt;-Operator überladen! Leider gibt mir dieser allerdings nur die Adresse auf den String aus, nicht aber den Inhalt. Dabei wüsste ich nicht, was ich falsch gemacht habe! In Google finde ich keine brauchbaren Hinweise...</p>
<p>Ich habe es auf g++ 4.4.3 Ubuntu und auf g++ 4.0.1 Apple, Inc probiert, beide haben den selben, eben beschriebenen Fehler.</p>
<p>Gruß, Micha</p>
<p>Quellcode:</p>
<pre><code class="language-cpp">#ifndef MyProgramm
#define MyProgramm

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

using namespace std;
class HalloWelt {
	public:
		HalloWelt(const string t); 
		friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp;, HalloWelt&amp;);
	private:
		std::string text;
};

HalloWelt::HalloWelt(const string t) {
	text.assign(t);
}

std::ostream&amp; operator&lt;&lt; (std::ostream&amp; out,HalloWelt&amp; hw) {
	return out &lt;&lt; hw.text;
}

int main (int argc, char** argv) {
	HalloWelt* hallowelt = new HalloWelt(&quot;hi\n&quot;);
	cout &lt;&lt; hallowelt &lt;&lt; endl;
	return 0;
}
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2066063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066063</guid><dc:creator><![CDATA[Kümmelkorn]]></dc:creator><pubDate>Thu, 19 May 2011 20:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 20:47:47 GMT]]></title><description><![CDATA[<p>Da schlägt wohl die Java-Erfahrung durch <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="😉"
    /> In C++ gibt es einen Unterschied zwischen Zeigern (bzw. dem Speicher dahinter) und &quot;normalen&quot; Variablen. Also entweder du legst deine Variable auf den Stack oder du dereferenzierst den Zeiger, um an die Variable heranzukommen:</p>
<pre><code class="language-cpp">//V1:
HalloWelt hallowelt (&quot;hi\n&quot;);
cout &lt;&lt; hallowelt &lt;&lt; endl;

//V2:
HalloWelt* hallowelt = new HalloWelt(&quot;hi\n&quot;);
cout &lt;&lt; *hallowelt &lt;&lt; endl;
</code></pre>
<p>(PS: Und mach dich mal über const-Correctness und Initialisierungslisten schlau)</p>
<p>Edit: Was mir noch aufgefallen ist: Include Guards im Hauptprogramm sind auch unnötig :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066065</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 May 2011 20:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 20:42:36 GMT]]></title><description><![CDATA[<blockquote>
<p>(PS: Und mach dich mal über const-Correctness und Initialisierungslisten schlau)</p>
</blockquote>
<p>Und darüber, dass zu jedem <code>new</code> ein <code>delete</code> gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066072</guid><dc:creator><![CDATA[Irgendwer]]></dc:creator><pubDate>Thu, 19 May 2011 20:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 21:10:34 GMT]]></title><description><![CDATA[<p>Oh man, was'n Fehler <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="😃"
    /> Ein Sternchen zu wenig und schon funktionier das Programm nicht mehr ^^ Danke für die schnelle Antwort <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>CStoll schrieb:</p>
<blockquote>
<p>(PS: Und mach dich mal über const-Correctness und Initialisierungslisten schlau)</p>
</blockquote>
<p>Danke für die Stichwörter! Stimmt der untere Quellcode besser? Mit const-correctness bin ich immer noch ein bisschen unsicher, gibt es da einfache Richtlinien, an denen man sich orientieren kann? Sollte man einfach immer const setzen, solange man kein schlagfertiges Argument dagegen hat?</p>
<blockquote>
<p>Edit: Was mir noch aufgefallen ist: Include Guards im Hauptprogramm sind auch unnötig :D)</p>
</blockquote>
<p>Ja, ist ja auch gemein, wenn man Header und Cpp-Datei zusammenkopiert <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>Und darüber, dass zu jedem new ein delete gehört.</p>
</blockquote>
<p>Ja, du hast ja recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f607.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_halo"
      title="O:-)"
      alt="😇"
    /> Das ist was ganz tolles an Java und Objective C 2.0 <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>Quellcode (wegen const-Correctness)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;string&gt; 

using namespace std; 
class HalloWelt { 
    public: 
        HalloWelt(const string t) : text(t) {}; 
        friend std::ostream&amp; operator&lt;&lt; ( std::ostream&amp;, const HalloWelt&amp;); 
    private: 
        std::string text; 
};

std::ostream&amp; operator&lt;&lt; ( std::ostream&amp; out, const HalloWelt&amp; hw) { 
    return out &lt;&lt; hw.text; 
} 

int main (int argc, char** argv) { 
    // Etwas übertrieben jetzt, aber im Prinzip doch genau das Richtige, für dieses Beispielprogramm?:
    HalloWelt const *const hallowelt = new HalloWelt(&quot;hi\n&quot;); 
    cout &lt;&lt; *hallowelt &lt;&lt; endl;
    delete hallowelt;
    return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2066089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066089</guid><dc:creator><![CDATA[Kümmelkorn]]></dc:creator><pubDate>Thu, 19 May 2011 21:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 21:12:51 GMT]]></title><description><![CDATA[<p>Das new ist hier total unnötig.<br />
Erzeuge das HalloWelt Objekt doch einfach auf dem Stack:</p>
<pre><code class="language-cpp">int main()
{
   HalloWelt h(&quot;Hello World&quot;);
   cout &lt;&lt; h &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2066093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066093</guid><dc:creator><![CDATA[scorcher24@public.pc]]></dc:creator><pubDate>Thu, 19 May 2011 21:12:51 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 21:13:12 GMT]]></title><description><![CDATA[<p>Der Construktor sollte seinen Parameter per konstante Referenz übergeben (spart unnötige Kopien). Die übrigen Parameter sehen gut aus.<br />
Bei dem Zeiger bin ich mir jetzt nicht sicher, ob das ein wenig übertrieben ist - aber ich hätte das Objekt auch gar nicht erst per new angelegt, wenn es nicht unbedingt notwendig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066095</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 May 2011 21:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 21:45:57 GMT]]></title><description><![CDATA[<p>Wenn du wirklich C++ lernen willst, solltest du dir unbedingt ein gutes C++ Buch kaufen, in dem dir typische C++-Konzepte wir RAII nähergebracht werden.<br />
Wegen RAII braucht man nämlich new und delete außerhalb von Konstruktoren und Destruktoren sehr selten.</p>
<p>RAII bedeutet so viel wie: Speicher per new im Konstruktor anfordern und per delete im Destruktor wieder freigeben. Und schon hast du deine Speicherverwaltung exceptionsicher gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066100</guid><dc:creator><![CDATA[Irgendwer]]></dc:creator><pubDate>Thu, 19 May 2011 21:45:57 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 21:51:44 GMT]]></title><description><![CDATA[<p>Irgendwer schrieb:</p>
<blockquote>
<p>RAII bedeutet so viel wie: Speicher per new im Konstruktor anfordern und per delete im Destruktor wieder freigeben. Und schon hast du deine Speicherverwaltung exceptionsicher gelöst.</p>
</blockquote>
<p>Natürlich nur solange du auch die &quot;Regel der Drei&quot; beachtest (d.h. wenn du einen Destruktor benötigst, brauchst du auch Kopier-Construktor und Zuweisungsoperator).<br />
Übrigens geht es bei RAII nicht nur um Speicherverwaltung, sondern um alle Arten von Resourcen, bei denen du sicher sein mußt, daß sie ordentlich wieder freigegeben werden (Datei-Handles, Fenster-Handles, Grafik-Objekte etc).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066102</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 May 2011 21:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 22:12:24 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Der Construktor sollte seinen Parameter per konstante Referenz übergeben (spart unnötige Kopien).</p>
</blockquote>
<p>Stimmt. Hatte ich sogar mal drin in einer vorherigen Version.</p>
<blockquote>
<p>ich hätte das Objekt auch gar nicht erst per new angelegt, wenn es nicht unbedingt notwendig ist.</p>
</blockquote>
<p>Interessant, ich dachte immer, das sei der &quot;normale&quot; Weg in C++. Hatte ich noch von grafischen Oberflächen so in Erinnerung.</p>
<blockquote>
<p>Wenn du wirklich C++ lernen willst, solltest du dir unbedingt ein gutes C++ Buch kaufen, in dem dir typische C++-Konzepte wir RAII nähergebracht werden.</p>
</blockquote>
<p>Danke für den Tipp. Habt ihr irgendwelche Buchempfehlungen? Ich finde es schwer, etwas passendes zu finden: Bevor ich das Buch lese, kenne ich schließlich die typischen C++-Konzepte nicht, da lässt sich ein Buch schwer beurteilen. C++ hat viele Konzepte, die ich aus Java nicht kenne, da wäre es schön, ein Buch zu haben!<br />
Irgendwelche Tipps für ein Buch, dass nicht zu schwer zu lesen ist (englisch oder deutsch)?</p>
<p>EDit: Genau so was meine ich: &quot;Natürlich nur solange du auch die &quot;Regel der Drei&quot; beachtest&quot; – Super, und sowas soll ich als Einsteiger wissen? Ich wäre wirklich dankbar für einen Buchtipp, der sich nicht (nur) an Anfänger richtet (also Grundlagen der OOP kann ich halt - wenn im Buch erst mal 30 Kapitel zu Vererbung stehen, finde ich das langweilig... es sei denn, es wird auf Unterschiede oder Sonderheiten von C++ eingegangen) <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/2066109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066109</guid><dc:creator><![CDATA[Kümmelkorn]]></dc:creator><pubDate>Thu, 19 May 2011 22:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Thu, 19 May 2011 22:38:13 GMT]]></title><description><![CDATA[<p>Kümmelkorn schrieb:</p>
<blockquote>
<blockquote>
<p>ich hätte das Objekt auch gar nicht erst per new angelegt, wenn es nicht unbedingt notwendig ist.</p>
</blockquote>
<p>Interessant, ich dachte immer, das sei der &quot;normale&quot; Weg in C++. Hatte ich noch von grafischen Oberflächen so in Erinnerung.</p>
</blockquote>
<p>Nein, ist in C++ überhaupt nicht üblich, im Gegensatz zu Sprachen mit Garbage Collector (z.B. Java oder C#).<br />
Als Einsteiger solltest du besser Objekte auf dem Stack unterbringen und existierende Klassen verwenden, die den ganzen RAII-Kram für dich übernehmen. Selber mit dieser Speicherverwaltung solltest du dich erst beschäftigen, wenn du dich ein wenig besser mit der Speicherverwaltung auskennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066113</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 May 2011 22:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Fri, 20 May 2011 06:23:08 GMT]]></title><description><![CDATA[<p>Für die Zukunft schon mal: Anstatt mit new ein Array anzulegen, nimm einen std::vector, der wächst sogar mit <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/2066144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066144</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 20 May 2011 06:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Fri, 20 May 2011 12:10:54 GMT]]></title><description><![CDATA[<p>Kümmelkorn schrieb:</p>
<blockquote>
<p>Sollte man einfach immer const setzen, solange man kein schlagfertiges Argument dagegen hat?</p>
</blockquote>
<p>Richtig!</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066319</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Fri, 20 May 2011 12:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen von &amp;lt;&amp;lt; gibt Adresse von String statt String zurück... on Fri, 20 May 2011 12:30:38 GMT]]></title><description><![CDATA[<p>Setze <code>const</code> nur, wenn dein Code dadurch wirklich sicherer wird. Im folgenden Beispiel haben beide <code>const</code> keinen Vorteil, aber machen den Code unübersichtlicher:</p>
<pre><code class="language-cpp">const MyClass Fn(const int i);
</code></pre>
<p>Die häufigsten Anwendungsfälle sind:</p>
<ul>
<li><code>const T&amp;</code> und <code>const T*</code> , also Referenzen und Zeiger auf konstante Objekte, vor allem in Parameterlisten</li>
<li><code>const T</code> für funktionslokale Konstanten</li>
<li><code>void MyClass::MemFn() const</code> für Memberfunktionen, welche das Objekt nicht ändern</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2066332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066332</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 20 May 2011 12:30:38 GMT</pubDate></item></channel></rss>