<?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[Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Überschrift beschreibt mein Problem schon ganz genau. Bisher habe ich diesen Ansatz, der den Adressoperator verwendet:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; bool are_equal(T &amp;x, T &amp;y){
  return (&amp;x == &amp;y);
}

int main(){
  int a,b;
  int &amp;c(a);
  std::cout&lt;&lt; are_equal(a,a)     // soll true sein
	   &lt;&lt; &quot; &quot; &lt;&lt; are_equal(a,b)  // soll false sein
	   &lt;&lt; &quot; &quot; &lt;&lt; are_equal(a,c)  // soll true sein
	   &lt;&lt; std::endl;
}
</code></pre>
<p>Das funktioniert auch wie gewünscht, aber ich habe zwei kleine Bedenken:</p>
<ol>
<li>
<p>Bisher habe ich noch nie wirklich mit dem Adressoperator gearbeitet, das ganze klingt als ob es ziemlich nahe an der Hardware ist. Gibt es da irgendwelche Fallstricke an die ich nicht gedacht habe?</p>
</li>
<li>
<p>Den Adressoperator kann man ja auch überladen, wodurch die Funktion nicht mehr funktionieren könnte. In meinem Fall wird das nicht vorkommen, weil ich alleine an dem Projekt arbeite und das entsprechend vermeiden werde. Aber aus Interesse: Fällt jemandem eine bessere Lösung ein, die dieses Problem vermeidet?</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/topic/244904/prüfen-ob-zwei-referenzen-sich-auf-das-selbe-objekt-beziehen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 01:28:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244904.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Jul 2009 14:29:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen on Tue, 07 Jul 2009 14:29:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Überschrift beschreibt mein Problem schon ganz genau. Bisher habe ich diesen Ansatz, der den Adressoperator verwendet:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; bool are_equal(T &amp;x, T &amp;y){
  return (&amp;x == &amp;y);
}

int main(){
  int a,b;
  int &amp;c(a);
  std::cout&lt;&lt; are_equal(a,a)     // soll true sein
	   &lt;&lt; &quot; &quot; &lt;&lt; are_equal(a,b)  // soll false sein
	   &lt;&lt; &quot; &quot; &lt;&lt; are_equal(a,c)  // soll true sein
	   &lt;&lt; std::endl;
}
</code></pre>
<p>Das funktioniert auch wie gewünscht, aber ich habe zwei kleine Bedenken:</p>
<ol>
<li>
<p>Bisher habe ich noch nie wirklich mit dem Adressoperator gearbeitet, das ganze klingt als ob es ziemlich nahe an der Hardware ist. Gibt es da irgendwelche Fallstricke an die ich nicht gedacht habe?</p>
</li>
<li>
<p>Den Adressoperator kann man ja auch überladen, wodurch die Funktion nicht mehr funktionieren könnte. In meinem Fall wird das nicht vorkommen, weil ich alleine an dem Projekt arbeite und das entsprechend vermeiden werde. Aber aus Interesse: Fällt jemandem eine bessere Lösung ein, die dieses Problem vermeidet?</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1738649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738649</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 07 Jul 2009 14:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen on Tue, 07 Jul 2009 14:50:26 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das funktioniert auch wie gewünscht, aber ich habe zwei kleine Bedenken:</p>
<ol>
<li>Bisher habe ich noch nie wirklich mit dem Adressoperator gearbeitet, das ganze klingt als ob es ziemlich nahe an der Hardware ist. Gibt es da irgendwelche Fallstricke an die ich nicht gedacht habe?</li>
</ol>
</blockquote>
<p>Bedenken brauchst Du keine haben, dass ist gar nicht so nah an der Hardware wie Du vielleicht meinst, sondern es ist vielmehr eine Definition, dass zwei Pointer mit identischen Typ auch auf das identische Objekt zeigen, wenn sie gleich sind. Es geht sogar so was:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

struct Base1 { virtual ~Base1() {} int m_dummy1; };
struct Base2 { virtual ~Base2() {} int m_dummy2; };

struct Foo : Base1, Base2
{
    int m_x;
};

int main ()
{
    Foo a;
    Base1* p1 = &amp;a;
    Base2* p2 = &amp;a;
    if( (void*)p1 != (void*)p2 )
        cout &lt;&lt; &quot;beide Pointer sind verschieden &quot; &lt;&lt; endl;
    if( p1 == dynamic_cast&lt; Base1* &gt;( p2 ) )
        cout &lt;&lt; &quot;.. zeigen aber auf das identische Objekt&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Ich würde die Funktion aber eher are_identical nennen - das ist ja der Unterschied: gleich &lt;-&gt; identisch.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<ol start="2">
<li>Den Adressoperator kann man ja auch überladen, wodurch die Funktion nicht mehr funktionieren könnte. In meinem Fall wird das nicht vorkommen, weil ich alleine an dem Projekt arbeite und das entsprechend vermeiden werde. Aber aus Interesse: Fällt jemandem eine bessere Lösung ein, die dieses Problem vermeidet?</li>
</ol>
</blockquote>
<p>Wenn der Adressoperator überladen ist, so sollte er auch ein sinnvolles Ergebnis liefern. D.h. die Funktion liefert das 'richtige' Ergebnis - im Sinne der Überladung.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738663</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 07 Jul 2009 14:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen on Tue, 07 Jul 2009 15:00:41 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Bedenken brauchst Du keine haben, dass ist gar nicht so nah an der Hardware wie Du vielleicht meinst, sondern es ist vielmehr eine Definition, dass zwei Pointer mit identischen Typ auch auf das identische Objekt zeigen, wenn sie gleich sind.</p>
</blockquote>
<p>Ausgezeichnet! Wenn das die Definition ist, ist es ja ganz genau so wie ich es will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738671</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 07 Jul 2009 15:00:41 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen on Tue, 07 Jul 2009 15:11:33 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Bisher habe ich noch nie wirklich mit dem Adressoperator gearbeitet, das ganze klingt als ob es ziemlich nahe an der Hardware ist. Gibt es da irgendwelche Fallstricke an die ich nicht gedacht habe?</p>
</blockquote>
<p>Mir fallen im Moment zwei ein, die aber etwas an den Haaren herbeigezogen sind:</p>
<pre><code class="language-cpp">struct X
{
  int i;
  operator int&amp;() {return i;}
};

struct Y : public X
{
  int&amp; ri;
  Y(X&amp; other) : ri(other.i) { i = other.i; }
  operator int&amp;() {return ri;}
};

int main()
{
  X x;
  int&amp; ri = x.i;
  std::cout &lt;&lt; are_equal&lt;int&gt;(ri, x) &lt;&lt; std::endl; //true, trotz verschiedener Typen
  std::cout &lt;&lt; are_equal&lt;int&gt;(x, y) &lt;&lt; std::endl; //mal true, 
  std::cout &lt;&lt; are_equal&lt;X&gt;(x, y) &lt;&lt; std::endl;   //mal false...
}
</code></pre>
<blockquote>
<ol start="2">
<li>Den Adressoperator kann man ja auch überladen, wodurch die Funktion nicht mehr funktionieren könnte. In meinem Fall wird das nicht vorkommen, weil ich alleine an dem Projekt arbeite und das entsprechend vermeiden werde. Aber aus Interesse: Fällt jemandem eine bessere Lösung ein, die dieses Problem vermeidet?</li>
</ol>
</blockquote>
<p>Den Adressoperator zu überladen ist selten eine gute Idee, wenn dadurch nicht die ursprüngliche Semantik gewahrt wird. Und die beinhaltet nunmal, bei ein und demselben Objekt den selben Wert zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738677</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Jul 2009 15:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob zwei Referenzen sich auf das selbe Objekt beziehen on Wed, 08 Jul 2009 00:49:59 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<ol start="2">
<li>Den Adressoperator kann man ja auch überladen, wodurch die Funktion nicht mehr funktionieren könnte. In meinem Fall wird das nicht vorkommen, weil ich alleine an dem Projekt arbeite und das entsprechend vermeiden werde. Aber aus Interesse: Fällt jemandem eine bessere Lösung ein, die dieses Problem vermeidet?</li>
</ol>
</blockquote>
<p>Programmierer, die den Adressoperator überladen, stehen meist auf der dunklen Seite der Macht.</p>
<p>Für diese Fälle haben die Jedis <code>boost::addressof</code> entwickelt. <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="😉"
    /><br />
Die Sache hängt also von deinem Vertrauen ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738925</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 08 Jul 2009 00:49:59 GMT</pubDate></item></channel></rss>