<?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[smart pointer: überladen von -&amp;gt; Operator]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich bin dabei ein smart pointer Klassentemplate zu schreiben. Jetzt frage ich mich aber: Wie kann ich den -&gt; Operator überladen dass, wenn der smart pointer auf eine Struktur zeigt, man direkt auf die Strukturmember zugreifen kann?<br />
Also sowas:</p>
<pre><code class="language-cpp">struct S
{
    int x, y;
};

int main()
{

    S obj;

    Pointer&lt;s&gt; p(obj);

    p-&gt;x = 100;

}
</code></pre>
<p>Ist das überhaupt möglich?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Pointer
{

	T *m_ptr;
	unsigned long *m_count;

	public:
		Pointer(const T &amp;obj)
		{
			m_ptr = new T(obj);
			m_count = new unsigned long(1);
		}

		~Pointer()
		{
			--*m_count;

			if(*m_count == 0)
			{
				delete m_ptr;
			}
		}

		Pointer(const Pointer &amp;p)
		{
			m_ptr = p.m_ptr;
			m_count = p.m_count;
			++*m_count;
		}

		Pointer&amp; operator = (const Pointer &amp;p)
		{
			if(p != *this)
			{
				~Pointer();
				m_ptr = p.m_ptr;
				m_count = p.m_count;
				++m_count;
			}

			return *this;
		}

		T&amp; operator * ()
		{
			return *m_ptr;
		}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/172926/smart-pointer-überladen-von-gt-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:51:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172926.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Feb 2007 18:17:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to smart pointer: überladen von -&amp;gt; Operator on Fri, 09 Feb 2007 18:17:08 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich bin dabei ein smart pointer Klassentemplate zu schreiben. Jetzt frage ich mich aber: Wie kann ich den -&gt; Operator überladen dass, wenn der smart pointer auf eine Struktur zeigt, man direkt auf die Strukturmember zugreifen kann?<br />
Also sowas:</p>
<pre><code class="language-cpp">struct S
{
    int x, y;
};

int main()
{

    S obj;

    Pointer&lt;s&gt; p(obj);

    p-&gt;x = 100;

}
</code></pre>
<p>Ist das überhaupt möglich?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Pointer
{

	T *m_ptr;
	unsigned long *m_count;

	public:
		Pointer(const T &amp;obj)
		{
			m_ptr = new T(obj);
			m_count = new unsigned long(1);
		}

		~Pointer()
		{
			--*m_count;

			if(*m_count == 0)
			{
				delete m_ptr;
			}
		}

		Pointer(const Pointer &amp;p)
		{
			m_ptr = p.m_ptr;
			m_count = p.m_count;
			++*m_count;
		}

		Pointer&amp; operator = (const Pointer &amp;p)
		{
			if(p != *this)
			{
				~Pointer();
				m_ptr = p.m_ptr;
				m_count = p.m_count;
				++m_count;
			}

			return *this;
		}

		T&amp; operator * ()
		{
			return *m_ptr;
		}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1225830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225830</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Feb 2007 18:17:08 GMT</pubDate></item><item><title><![CDATA[Reply to smart pointer: überladen von -&amp;gt; Operator on Fri, 09 Feb 2007 18:26:35 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Sollte so aussehen</p>
<pre><code class="language-cpp">T&amp; operator -&gt; ()
{
  return *m_ptr;
} 
const T&amp; operator -&gt; () const
{
  return *m_ptr;
}
</code></pre>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225835</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 09 Feb 2007 18:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to smart pointer: überladen von -&amp;gt; Operator on Fri, 09 Feb 2007 18:47:28 GMT]]></title><description><![CDATA[<p>Ich hab's doch noch gefunden. So macht man's:</p>
<p>T* operator -&gt; ()<br />
{<br />
return m_ptr;<br />
}</p>
<p>Danke trotzdem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225852</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Feb 2007 18:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to smart pointer: überladen von -&amp;gt; Operator on Fri, 09 Feb 2007 18:52:28 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>Sollte so aussehen</p>
<pre><code class="language-cpp">T&amp; operator -&gt; ()
{
  return *m_ptr;
} 
const T&amp; operator -&gt; () const
{
  return *m_ptr;
}
</code></pre>
<p>bis bald<br />
akari</p>
</blockquote>
<p>Das hätte Endlosrekursion zur Folge.</p>
<p>Stöffel schrieb:</p>
<blockquote>
<p>Hallo zusammen!</p>
<p>Ich bin dabei ein smart pointer Klassentemplate zu schreiben. Jetzt frage ich mich aber: Wie kann ich den -&gt; Operator überladen dass, wenn der smart pointer auf eine Struktur zeigt, man direkt auf die Strukturmember zugreifen kann?<br />
Also sowas:</p>
<pre><code class="language-cpp">struct S
{
    int x, y;
};

int main()
{

    S obj;

    Pointer&lt;s&gt; p(obj);

    p-&gt;x = 100;

}
</code></pre>
<p>Ist das überhaupt möglich?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Pointer
{

	T *m_ptr;
	unsigned long *m_count;
	
	public:
		Pointer(const T &amp;obj)
		{
			m_ptr = new T(obj);
			m_count = new unsigned long(1);
		}
		
		~Pointer()
		{
			--*m_count;
			
			if(*m_count == 0)
			{
				delete m_ptr;
			}
		}
		
		Pointer(const Pointer &amp;p)
		{
			m_ptr = p.m_ptr;
			m_count = p.m_count;
			++*m_count;
		}
		
		Pointer&amp; operator = (const Pointer &amp;p)
		{
			if(p != *this)
			{
				~Pointer();
				m_ptr = p.m_ptr;
				m_count = p.m_count;
				++m_count;
			}
			
			return *this;
		}
		
		T&amp; operator * ()
		{
			return *m_ptr;
		}
};
</code></pre>
</blockquote>
<p>Um das Verhalten des Operators -&gt; für Klassenobjekte zu verstehen, muss man zunächst den Mechanismus des eingebauten Operators für Zeiger begreifen. Das Ergebnis der Anwendung des eingebauten Operators ist ein Ausdruck, der nur auf eine einzige Weise verwendet werden kann: durch Benutzung mit einem Bezeichner eines Klassenmembers. Wesentlich daran ist, dass dieses Etwas kein Objekt ist und auch keinen Typ hat (Ganz analog zum Operator -&gt;*, dieser hat aber <em>zwei</em> Parameter) - das bedeutet auch, dass dieses Etwas nicht unmittelbar das Ergebnis eines überladenen Operators -&gt; sein kann, mithin das Verhalten des eingebauten Operators nicht unmittelbar nachvollzogen werden kann. Deshalb benutzt der Standard hier ein wenig 'Magie' - Auf das Ergebnis eines überladenen Operators -&gt; wird wiederum dieser Operator aufgerufen - solange, bis jenes Ergebnis irgendwann ein Pointer ist und die eingebaute Semantik greift. Eine einzige Verwendung des Operators -&gt; kann daher eine große Zahl von Funktionsaufrufen implizieren. Richtigerweise sollte die Überladung daher so aussehen:</p>
<pre><code class="language-cpp">T* operator-&gt;() const
{
    return m_ptr;
}
</code></pre>
<p>constness des Pointers und constness des Pointees sind üblicherweise nicht identisch.<br />
Auf schwerwiegende Defizite des restlichen Codes kann auch jemand anderes hinweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225857</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 09 Feb 2007 18:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to smart pointer: überladen von -&amp;gt; Operator on Fri, 09 Feb 2007 19:14:27 GMT]]></title><description><![CDATA[<p>Schwerwiegende Defizite? In meinem Code? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1225870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225870</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Feb 2007 19:14:27 GMT</pubDate></item></channel></rss>