<?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[Referenzen in Klassen]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eigentlich einen vernünftigen Grund warum Referenzen nicht kopierbar sind?</p>
<p>Ich habe viele kopierbare Klassen, die als member &quot;Referenzen&quot; auf andere Klassen halten.<br />
Da kann man dann entweder Pointer (unschön, weil dann nicht klar ist, ob das ganze nicht doch NULL sein kann und wegen Konvertierung der Argumente) oder std::reference_wrapper&lt;T&gt; (unschön, weil zu lang/unleserlich, unbekannt und wegen Konvertierung der Argumente) verwenden. <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="😞"
    /><br />
Wie geht ihr damit um?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323212/referenzen-in-klassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 09:14:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323212.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 21 Jan 2014 14:40:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 15:06:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eigentlich einen vernünftigen Grund warum Referenzen nicht kopierbar sind?</p>
<p>Ich habe viele kopierbare Klassen, die als member &quot;Referenzen&quot; auf andere Klassen halten.<br />
Da kann man dann entweder Pointer (unschön, weil dann nicht klar ist, ob das ganze nicht doch NULL sein kann und wegen Konvertierung der Argumente) oder std::reference_wrapper&lt;T&gt; (unschön, weil zu lang/unleserlich, unbekannt und wegen Konvertierung der Argumente) verwenden. <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="😞"
    /><br />
Wie geht ihr damit um?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378769</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Tue, 21 Jan 2014 15:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 14:52:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe viele kopierbare Klassen, die als member Referenzen auf andere Klassen halten.</p>
</blockquote>
<p>Ich habe keine Referenzen als Member. Ist viel zu problematisch bspw. bei Kopier- oder Move-Konstruktor/Operator. Oder Zuweisungen: Veraendern auch andere Objekte.</p>
<blockquote>
<p>Ich habe viele kopierbare Klassen, die als member Referenzen auf andere Klassen halten.</p>
</blockquote>
<p>Wie unterscheidest du tiefe und flache Kopie?</p>
<blockquote>
<p>Da kann man dann entweder Pointer ...</p>
</blockquote>
<p>Da fehlt das Hauptverb.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378770</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 21 Jan 2014 14:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 14:54:19 GMT]]></title><description><![CDATA[<p>C14 schrieb:</p>
<blockquote>
<p>gibt es eigentlich einen vernünftigen Grund warum Referenzen nicht kopierbar sind?</p>
</blockquote>
<p>Sie sind kopierbar, sonst könntest du keine Referenzen an Funktionen übergeben. Sie sind aber nicht zuweisbar, weil sie bei der Definition initialisiert werden und nachher nicht mehr verändert werden können. Genau wie <code>const</code> -Variablen.</p>
<p>C14 schrieb:</p>
<blockquote>
<p>Wie geht ihr damit um?</p>
</blockquote>
<p>Zeiger nehmen, wenn Referenzen zu unflexibel sind. Sicher nicht <code>std::reference_wrapper</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378771</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 21 Jan 2014 14:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 16:50:31 GMT]]></title><description><![CDATA[<p>Referenzen als Klassenelemente sind eigentlich nur dann praktisch, wenn man eine Klasse schreibt, die sich selbst so wie eine Referenz verhalten soll. Zumindest wird der Compiler in dem Fall keinen Zuweisungsoperator automatisch generieren. Und das ist in dem Fall ja auch gut so, da man die Zuweisungen bei solchen &quot;Referenz-Proxies&quot; eh selbst händeln muss.</p>
<p>reference_wrapper&lt;&gt; dagegen ist ein komischer Mix aus C++ Referenz und Zeiger, vom Verhalten her...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378790</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 21 Jan 2014 16:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 17:58:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Sicher nicht std::reference_wrapper.</p>
</blockquote>
<p>Das ist dafür auch nicht gedacht. Sondern bspw. für Container, oder als Funktor-Wrapper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378808</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 21 Jan 2014 17:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 18:36:48 GMT]]></title><description><![CDATA[<p>edit: Ich sehe ein, dass das deep copy Verhalten für Referenzen als default Sinn macht <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>In meinem Fall sind die referenzierten Objekte aber quasi singletons oder haben zumindest eine hohe Lebenszeit.<br />
Es sind service Objekte die zum Teil Betriebssystemresourcen kapseln. (z.B. threadpool, logger, tempfile-manager)</p>
<p>Bei einer Kopie des Objekts sollen diese Abhängigkeiten nur flach kopiert werden.</p>
<p>Es ist legacy code und aktuell wird es mit Zeigern gemacht.<br />
Da schlecht dokumentiert ist, bei welchen davon null erlaubt ist, wird oft unnötig auf null geprüft.<br />
Was spricht da gegen std::reference_wrapper?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378811</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Tue, 21 Jan 2014 18:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 19:07:56 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Sicher nicht std::reference_wrapper.</p>
</blockquote>
<p>Das ist dafür auch nicht gedacht.</p>
</blockquote>
<p>Wer definiert, wofür reference_wrapper gedacht ist?</p>
<blockquote>
<p>Sondern bspw. für [<em>den Einsatz in einem</em>] Container,</p>
</blockquote>
<p>Wo ist da der Unterschied zu Pointern?</p>
<blockquote>
<p>oder als Funktor-Wrapper.</p>
</blockquote>
<p>Ein Wrapper um Funktor? (Ja, schon klar, wie das gemeint ist)</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>reference_wrapper&lt;&gt; dagegen ist ein komischer Mix aus C++ Referenz und Zeiger, vom Verhalten her...</p>
</blockquote>
<p>reference_wrapper&lt;&gt; ist ein Non-Null-Pointer, wo ist da ein Komiker?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378824</guid><dc:creator><![CDATA[wortanalyse]]></dc:creator><pubDate>Tue, 21 Jan 2014 19:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Tue, 21 Jan 2014 19:29:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Wo ist da der Unterschied zu Pointern?</p>
</blockquote>
<p>Stellst du dich doof?</p>
<blockquote>
<p>reference_wrapper&lt;&gt; ist ein <strong>Non-Null</strong>-Pointer</p>
</blockquote>
<blockquote>
<p>Ein Wrapper um Funktor?</p>
</blockquote>
<p>Nein, ein Zirkusclown.</p>
<blockquote>
<p>(Ja, schon klar, wie das gemeint ist)</p>
</blockquote>
<p>Wieso fragst du dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378825</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 21 Jan 2014 19:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Wed, 22 Jan 2014 10:21:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Es ist legacy code und aktuell wird es mit Zeigern gemacht.</p>
</blockquote>
<p>Ich benutze auch in Nicht-Legacy-Code noch viele rohe Zeiger. Warum willst du sie mit ersetzen? Nur um die Tests auf Null zu entfernen? Der Aufwand lohnt wahrscheinlich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378909</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jan 2014 10:21:01 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in Klassen on Wed, 22 Jan 2014 11:58:15 GMT]]></title><description><![CDATA[<p>wortanalyse schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>reference_wrapper&lt;&gt; dagegen ist ein komischer Mix aus C++ Referenz und Zeiger, vom Verhalten her...</p>
</blockquote>
<p>reference_wrapper&lt;&gt; ist ein Non-Null-Pointer, wo ist da ein Komiker?</p>
</blockquote>
<p>Ein Non-Null-Pointer, der sich zum Teil wie eine Referenz verhält, mit Ausname des Zuweisungsoperators:</p>
<pre><code class="language-cpp">#include &lt;functional&gt;

using std::reference_wrapper;

struct fu
{
    void operator()(int) const {}
};

void foo(int&amp;) {}

void bar()
{
    int i = 23;
    reference_wrapper&lt;int&gt; r = i; // &lt;-- Initialisierung wie eine Referenz
    foo(r);                       // &lt;-- Keine Dereferenzierung nötig

    fu o;
    reference_wrapper&lt;fu&gt; w = o;  // &lt;-- Initialisierung wie eine Referenz
    w(23);                        // &lt;-- Keine Dereferenzierung nötig
    fu *ptr = &amp;o;
    ptr(24);                      // &lt;-- Funzt nicht ohne Dereferenzierung
}
</code></pre>
<p>Es bietet also eine implizite Lvalue of T -&gt; reference_wrapper&lt;T&gt; als auch eine implizite reference_wrapper&lt;T&gt; -&gt; Lvalue of T Konvertierung an.</p>
<p>Komisch ist dieses Verhalten meiner Meinung nach in Verbindung mit dem Zuweisungsoperator.</p>
<pre><code class="language-cpp">void wtf()
{
    int i = 23;
    reference_wrapper&lt;int&gt; x = i; // x bezieht sich auf i.
    int j = x;                    // j hat den gleichen Wert wie i.
    x = j;                        // x bezieht sich jetzt auf j statt dass
                                  // der Wert von j nach i kopiert wird.
}
</code></pre>
<p>Im Übrigen heißt das Ding nicht <code>pointer_wrapper</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378921</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:58:15 GMT</pubDate></item></channel></rss>