<?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[Ausgeben von Referenzen über std::cout]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mal eine naive Frage: Warum kann ich denn keine Referenz auf eigene Objekte direkt über std::out ausgeben?</p>
<p>Also Bsp.:</p>
<pre><code class="language-cpp">// Pseudocode Beispiel
class MyClass {
...
};

...
void OtherClass::test(MyClass&amp; myClass)
{
    std::cout &quot;MyClass: &quot; &lt;&lt; myClass &lt;&lt; std::endl:
}
</code></pre>
<p>Das gibt nen Compilerfehler:</p>
<pre><code>error: no match for 'operator&lt;&lt;' in 'std::operator&lt;&lt; [with _Traits = std::char_traits&lt;char&gt;](((std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)(&amp; std::cout)), ((const char*)&quot;MyClass: &quot;)) &lt;&lt; myClass'
</code></pre>
<p>Denke mal, dass dies nur mit Basistypen (wie z.B. int) geht, oder solchen Klassen, die mit dem &lt;&lt;-Operator von std::out klarkommen, oder?<br />
Muss ich hier die Adresse von myClass nehmen, also &amp;myClass? Oder eine andere Methode von std?</p>
<p>Vielen Dank schon einmal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268348/ausgeben-von-referenzen-über-std-cout</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 21:04:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268348.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jun 2010 21:26:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Mon, 07 Jun 2010 21:26:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mal eine naive Frage: Warum kann ich denn keine Referenz auf eigene Objekte direkt über std::out ausgeben?</p>
<p>Also Bsp.:</p>
<pre><code class="language-cpp">// Pseudocode Beispiel
class MyClass {
...
};

...
void OtherClass::test(MyClass&amp; myClass)
{
    std::cout &quot;MyClass: &quot; &lt;&lt; myClass &lt;&lt; std::endl:
}
</code></pre>
<p>Das gibt nen Compilerfehler:</p>
<pre><code>error: no match for 'operator&lt;&lt;' in 'std::operator&lt;&lt; [with _Traits = std::char_traits&lt;char&gt;](((std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)(&amp; std::cout)), ((const char*)&quot;MyClass: &quot;)) &lt;&lt; myClass'
</code></pre>
<p>Denke mal, dass dies nur mit Basistypen (wie z.B. int) geht, oder solchen Klassen, die mit dem &lt;&lt;-Operator von std::out klarkommen, oder?<br />
Muss ich hier die Adresse von myClass nehmen, also &amp;myClass? Oder eine andere Methode von std?</p>
<p>Vielen Dank schon einmal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908627</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Mon, 07 Jun 2010 21:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Mon, 07 Jun 2010 21:32:04 GMT]]></title><description><![CDATA[<p>Du musst den Operator &lt;&lt; überladen:</p>
<pre><code class="language-cpp">std::ostream&amp; operator &lt;&lt; (std::ostream&amp; out, const MyClass&amp; data) {
    // ...
    // Einzelne Attribute von data ausgeben
    // ...

    // Referenz auf Ausgabestream zurückgeben (ermöglicht die Verkettung von &lt;&lt;)
    return out;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908629</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Jun 2010 21:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Mon, 07 Jun 2010 21:38:53 GMT]]></title><description><![CDATA[<p>Vielen Dank! Hatte ich fast befürchtet!</p>
<p>Was ist denn das Vorgehen, wenn ich prüfen möchte, ob das Objekt, das durch die Referenz repräsentiert wird das gleich ist, wie z.B. in der aufrufenden Methode? Gebe ich dann die Adresse der Referenz aus (also im Bsp. &amp;myClass)?</p>
<p>Hintergrund ist, dass ich aufgrund von Refactoring nun Referenzvariablen in einer abstrakten Basisklasse habe, die beim Aufruf des Konstrukturs der abgeleiteten Klasse initialiisert werden (der Konstruktor der abgleiteten Klasse erhält 2 Referenzparameter und übergibt die dem Konstruktor der Basisklasse). Die Referenzvariablen der Basisklasse sind protected, so dass ich davon ausgehe, dass sie in Methoden der abgleiteten Klasse mit den im Konstruktor übergebenen Werten zur Verfügung stehen. Nun will ich prüfen, ob hier mein Denkfehler liegt und nun in der Basisklasse Referenzen auf die Referenz bestehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908634</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Mon, 07 Jun 2010 21:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 05:12:33 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Was ist denn das Vorgehen, wenn ich prüfen möchte, ob das Objekt, das durch die Referenz repräsentiert wird das gleich ist, wie z.B. in der aufrufenden Methode? Gebe ich dann die Adresse der Referenz aus (also im Bsp. &amp;myClass)?</p>
</blockquote>
<p>Nachdem, was ich gelesen habe, heißt gleich für dich, gleicher Speicherbereich.</p>
<p>Leider muss das bei Mehrfachvererbung (ich weiß nicht ob anders auch) nicht<br />
zwangsläufig der Fall sein:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
class A{
int i;
};
class B{
int j;
};
class C : public A, public B{};
int main()
{
        C c;
        A&amp; aRef = c;
        B&amp; bRef = c;
        C&amp; cRef = c;
        std::cout &lt;&lt; &amp;aRef &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;bRef &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;cRef &lt;&lt; std::endl;
}
</code></pre>
<blockquote>
<p>0xbffff9cc<br />
0xbffff9d0<br />
0xbffff9cc</p>
</blockquote>
<p>Du kannst sogar Beispiele konstruieren, wo eine Referenz des gleichen Typs nicht<br />
zwangsläufig die gleiche Adresse hat, weil ein Objekt doppelt davon erbt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
class A{
int i;
};
class B : public A{
};
class C : public A{
};
class D : public B, public C{};
int main()
{
        D d;
        C&amp; cRef = d;
        B&amp; bRef = d;
        A&amp; a1Ref = cRef;
        A&amp; a2Ref = bRef;
        std::cout &lt;&lt; &amp;a1Ref &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;a2Ref &lt;&lt; std::endl;
}
</code></pre>
<blockquote>
<p>0xbffff9cc<br />
0xbffff9c8</p>
</blockquote>
<p>Falls du allerdings immer(!!!) virtuell (oder nicht doppelt) von dieser Klasse erbst, kriegst du<br />
(glaub ich) immer die gleiche Speicheradresse bei Verwendung einer Referenz<br />
auf diese virtuell geerbte Klasse.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
class A{
int i;
};
class B : virtual public A{
};
class C : virtual public A{
};
class D : public B, public C{};
int main()
{
        D d;
        C&amp; cRef = d;
        B&amp; bRef = d;
        A&amp; a1Ref = cRef;
        A&amp; a2Ref = bRef;
        std::cout &lt;&lt; &amp;a1Ref &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;a2Ref &lt;&lt; std::endl;
}
</code></pre>
<blockquote>
<p>0xbffff9cc<br />
0xbffff9cc</p>
</blockquote>
<p>Bei einfachen Vererbungsketten (keine Mehrfachvererbung) brauchen die<br />
Typen der Referenzen (bei vermutlich vielen Compilern) nichtmal gleich sein.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
class A{
int i;
};
class B : public A{
int j;
};
class C : public B{
int k;
};
int main()
{
        C c;
        A&amp; aRef = c;
        B&amp; bRef = c;
        C&amp; cRef = c;
        std::cout &lt;&lt; &amp;aRef &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;bRef &lt;&lt; std::endl;
        std::cout &lt;&lt; &amp;cRef &lt;&lt; std::endl;
}
</code></pre>
<blockquote>
<p>0xbffff9c8<br />
0xbffff9c8<br />
0xbffff9c8</p>
</blockquote>
<p>Zu debug-Zwecken reicht aber eine einfache Ausgabe der Speicheradresse auf<br />
gleichen Referenztypen basierend, häufig aus.</p>
<p>Bevor jetzt Beschwerden kommen, dass der Standard das aber nicht garantiert:<br />
-&gt; Es sind nur praktische Hinweise, die wohl (vermutlich) auf einen Großteil<br />
der Compiler zutreffen</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908711</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 08 Jun 2010 05:12:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 06:08:40 GMT]]></title><description><![CDATA[<p>Gibt es denn dann in C++ eine einfache Möglichkeit, so eine Gleichheit zu prüfen bzw. über Ausgaben im Debugmodus nach zu vollziehen?</p>
<p>Unter Java ist dies sehr einfach, man gibt einfach das Objekt selbst aus, dann wird automatisch dessen eindeutige ID rausgeschrieben:</p>
<pre><code class="language-java">// Pseudocode
...
MyObject o1 = new MyObject();

System.out.println(o1);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908719</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 08 Jun 2010 06:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 06:43:46 GMT]]></title><description><![CDATA[<p>Gib der klasse eine statische ID, zähl die bei den Konstruktoren hoch, speicher den jeweiligen Wert im Objekt. Fertig. Darfst natürlich Kopierkonstruktor und Zuweisungoperatoren etc nicht vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908731</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 08 Jun 2010 06:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:14:13 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>mal eine naive Frage: Warum kann ich denn keine Referenz auf eigene Objekte direkt über std::out ausgeben?</p>
</blockquote>
<p>Das hängt damit zusammen, daß wenn Du eine Referenz aufrufst, sich das ganze so verhält, als hättest Du den Wert direkt aufgerufen:</p>
<pre><code class="language-cpp">MyObject o;

cout &lt;&lt; o;
// Geht logischerweise nicht.

MyObject &amp;r = o;

cout &lt;&lt; r;
// Das gleiche in grün, deshalb geht es auch nicht.
</code></pre>
<p>Um es mal mit Zeigern zu vergleichen:</p>
<pre><code class="language-cpp">MyObject *p = &amp;o;

cout &lt;&lt; p;
// Geht natürlich, weil er nur eine Adresse ausgibt.
// Aber:
cout &lt;&lt; r;
// würde eher dem Aufruf
cout &lt;&lt; *p;
// entsprechen, was wiederum
cout &lt;&lt; o;
// entspricht.
// Und daß das nicht geht, dürfte einleuchten.
</code></pre>
<p>Alles klar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908735</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:46:55 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11624">@NES-Spieler</a>:</p>
<p>Denke schon.<br />
Nach meinem Verständnis eurer Antworten geht das deshalb nicht, weil ostream bzw. der &lt;&lt;-Operator nicht wissen, wie sie mit dem Wert eines Objektes (also nicht seiner Speicheradresse) umgehen sollen.<br />
Daher auch der Hinweis von daersc, dass man den Operator überladen müsste.<br />
Dieses Überladen würde man dann in seiner eigenen Klasse machen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908745</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:46:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:50:03 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Dieses Überladen würde man dann in seiner eigenen Klasse machen, oder?</p>
</blockquote>
<p>Entweder in der Klasse selbst oder als globale Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908748</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:53:26 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Dieses Überladen würde man dann in seiner eigenen Klasse machen, oder?</p>
</blockquote>
<p>Nein, das muss man in einer freien Funktion machen, denn es wäre ja wenn überhaupt eine Klassenmethode eine Methode von std::ostream und da kommst du nicht ran. Daher als freie Funktion. Siehe auch hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908749</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:53:26 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:57:05 GMT]]></title><description><![CDATA[<p>Reth schrieb:</p>
<blockquote>
<p>Dieses Überladen würde man dann in seiner eigenen Klasse machen, oder?</p>
</blockquote>
<p>Nein, der überladene Operator gehört ja zu ostream und nicht zu deiner Klasse.<br />
Da man nicht im ostream-Header herumbasteln darf/sollte, definiert man ihn als globale Funktion.</p>
<p>Edit: könnte schwören, dass SeppJ's Beitrag zehn Sekunden vor dem Absenden noch nicht da war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908750</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 07:59:44 GMT]]></title><description><![CDATA[<p>Wobei ich hier schon öfter das Vorgehen &quot;freie Funktion ruft public Memberfunktion auf&quot; gesehen habe. So in der Art</p>
<pre><code class="language-cpp">class myClass {
   // ... säckeweise private-Member...
public:
   virtual ostream&amp; print(ostream&amp;) const; // hat Zugriff auf Obige und wird weitervererbt
};

ostream&amp; operator&lt;&lt;(ostream&amp; ost, myClass const&amp; m) { return m.print(ost); }
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908752</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 08 Jun 2010 07:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgeben von Referenzen über std::cout on Tue, 08 Jun 2010 08:05:57 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Edit: könnte schwören, dass SeppJ's Beitrag zehn Sekunden vor dem Absenden noch nicht da war.</p>
</blockquote>
<p>Dann würde ich mich aber mal bei deinem Internet Provider beschweren,<br />
wenn das Senden ca. 1,5 Minuten dauert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Mein Ping braucht ja schon fast 400ms, aber das ist schon etwas sehr heftig <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1908760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908760</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 08 Jun 2010 08:05:57 GMT</pubDate></item></channel></rss>