<?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[Casting-Arten für z.B. Pointers]]></title><description><![CDATA[<p>Hallo</p>
<p>wenn man einen gegeben Pointer 'ptr' in einen anderen Pointertyp umwandeln möchte, dann könnte man das folgendermassen machen:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
 pClassPtr = (MeineKlasse*) ptr;
</code></pre>
<p>Nun habe ich mal Code gesehen, bei welchem es so gemacht wird:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
reinterpret_cast&lt;MeineKlasse*&gt;(ptr);
</code></pre>
<p>Die MSDN meint zu Letzterem, dass es höchst unsicher sei. Na ok, aber das wird's bei der 1. Version oben wohl auch so sein.</p>
<p>Frage: Welche dieser Möglichkeiten wird gemäss den 'best practices' eher verwendet? (wenn überhaupt)</p>
<p>Aja, gibt es eigentlich eine Möglichkeit zu prüfen, ob ein Pointer von einem bestimmten Typ ist?</p>
<p>In Java kann man herausfinden, um welchen Klassentyp es sich dabei handelt.<br />
C++ kennt angeblich auch so etwas, aber jene Methode die ich damals gefunden hab, konnte man nur in bestimmten Situationen verwenden.</p>
<p>Thanks for any good comments <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/119183/casting-arten-für-z-b-pointers</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 20:13:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119183.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Aug 2005 09:34:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 09:58:28 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>wenn man einen gegeben Pointer 'ptr' in einen anderen Pointertyp umwandeln möchte, dann könnte man das folgendermassen machen:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
 pClassPtr = (MeineKlasse*) ptr;
</code></pre>
<p>Nun habe ich mal Code gesehen, bei welchem es so gemacht wird:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
reinterpret_cast&lt;MeineKlasse*&gt;(ptr);
</code></pre>
<p>Die MSDN meint zu Letzterem, dass es höchst unsicher sei. Na ok, aber das wird's bei der 1. Version oben wohl auch so sein.</p>
<p>Frage: Welche dieser Möglichkeiten wird gemäss den 'best practices' eher verwendet? (wenn überhaupt)</p>
<p>Aja, gibt es eigentlich eine Möglichkeit zu prüfen, ob ein Pointer von einem bestimmten Typ ist?</p>
<p>In Java kann man herausfinden, um welchen Klassentyp es sich dabei handelt.<br />
C++ kennt angeblich auch so etwas, aber jene Methode die ich damals gefunden hab, konnte man nur in bestimmten Situationen verwenden.</p>
<p>Thanks for any good comments <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>
]]></description><link>https://www.c-plusplus.net/forum/post/860512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860512</guid><dc:creator><![CDATA[sky21]]></dc:creator><pubDate>Mon, 29 Aug 2005 09:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 09:56:22 GMT]]></title><description><![CDATA[<p>Du kannst einen Pointer umwandeln mit static_cast wenn du weißt was für ein Typ es ist und wenn man den Pointer in den Zieltyp umwandeln kann.<br />
Mit reinterpret_cast umgehst du jegliche Typsicherheit, da diese Umwandlung wie der Name schon sagt, die Bytes einfach neu interpretiert.</p>
<p>Das was du in deinem letzten Absatz ansprichst ist dynamic_cast damit kannst du zB ein Basisklassenobjek in ein Objekt einer abgeleiteten Klasse umwandeln, das geschieht im Gegensatz zu den anderen casting Typen zur Laufzeit und kann auch fehlschlagen. Am besten ist wohl nen Beispiel:</p>
<pre><code class="language-cpp">struct Base{};
struct Derived : Base{};

void bar( const Base* obj )
{
  if( ( Derived* myDerived = dynamic_cast&lt; Derived* &gt;( obj ) ) != 0 )
     cout &lt;&lt; &quot;Es ist ein Derived Objekt&quot; &lt;&lt; endl;
  if( ( Base* myBase = dynamic_cast&lt; Base* &gt;( obj ) ) != 0 )
     cout &lt;&lt; &quot;Es ist ein Base Objekt&quot; &lt;&lt; endl;
}

int main ()
{
  Base* base = new Base;
  Base* derBase = new Derived;
  Derived* der = new Derived;

  bar( base );
  bar( derBase );
  bar( der );
 // zu faul für die deletes
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/860529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860529</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Mon, 29 Aug 2005 09:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 10:01:37 GMT]]></title><description><![CDATA[<p>sky21 schrieb:</p>
<blockquote>
<p>wenn man einen gegeben Pointer 'ptr' in einen anderen Pointertyp umwandeln möchte, dann könnte man das folgendermassen machen:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
 pClassPtr = ptr;
</code></pre>
</blockquote>
<p>Das geht aber nur, wenn ptr ein Zeiger auf eine von MeineKlasse abgeleitete Klasse ist (oder selbst auf MeineKlasse, aber das wär dann nicht wirklich eine Typ-&quot;Umwandlung&quot;)</p>
<blockquote>
<p>Nun habe ich mal Code gesehen, bei welchem es so gemacht wird:</p>
<pre><code class="language-cpp">MeineKlasse* pClassPtr = NULL;
reinterpret_cast&lt;MeineKlasse*&gt;(ptr);
</code></pre>
<p>Die MSDN meint zu Letzterem, dass es höchst unsicher sei. Na ok, aber das wird's bei der 1. Version oben wohl auch so sein.</p>
</blockquote>
<p>Der reinterpret_cast funktioniert aber auch dann, wenn die Typen nicht zueinander passen. Das einfache zuweisen wie oben funktioniert ja eben nur in sehr sehr speziellen Fällen.</p>
<blockquote>
<p>Frage: Welche dieser Möglichkeiten wird gemäss den 'best practices' eher verwendet? (wenn überhaupt)</p>
</blockquote>
<p>Die sicherste, die möglich ist. Schau dir die ganzen Cast-Operatoren mal an (static_cast, dynamic_cast, reinterpret_cast, const_cast).</p>
<blockquote>
<p>Aja, gibt es eigentlich eine Möglichkeit zu prüfen, ob ein Pointer von einem bestimmten Typ ist?</p>
</blockquote>
<p>Ich nehm an, du meinst eine Laufzeitprüfung. Schau dir RTTI an (dynamic_cast, typeid). Das funktioniert aber nur bei polymorphen Typen, also Klassen, die mindestens eine virtuelle Memberfunktion enthalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860534</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 10:06:12 GMT]]></title><description><![CDATA[<p>Kommt drauf an wenn du den Cast wirklich erzwingen musst (wie z.B. von char* auf int*) dann brauchst du reinterpret_cast&lt;&gt;. Bei Polymorphie gehts mit dynamic_cast&lt;&gt;:</p>
<pre><code class="language-cpp">class Foo { };
class Bar : public Foo { void go() { cout &lt;&lt; &quot;I'm Bar::go()&quot; &lt;&lt; endl; };

Foo* pFoo = new Bar;
Bar* pBar = dynamic_cast&lt;Bar*&gt;(pFoo);
if(pBar) pBar-&gt;go();
</code></pre>
<p>&lt;edit&gt;manman wieder zu langsam *hrhr*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860537</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 29 Aug 2005 10:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 20:17:52 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>Kommt drauf an wenn du den Cast wirklich erzwingen musst (wie z.B. von char* auf int*) dann brauchst du reinterpret_cast&lt;&gt;. Bei Polymorphie gehts mit dynamic_cast&lt;&gt;:</p>
</blockquote>
<p>Was allerdings nur beim downcasten sinnvoll ist, ansonsten reicht static_cast vollkommmen aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860958</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 29 Aug 2005 20:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 20:20:21 GMT]]></title><description><![CDATA[<p>Für den Upcast braucht man keinen extra cast das geht automatisch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860959</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 29 Aug 2005 20:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 20:32:50 GMT]]></title><description><![CDATA[<p>Für den downcast reicht oftmals auch nen static_cast, der dynamic_cast ist nur dann notwendig, wenn man nicht sicher weiß, dass das Objekt 100%ig vom Typ x ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/860967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860967</guid><dc:creator><![CDATA[User---]]></dc:creator><pubDate>Mon, 29 Aug 2005 20:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 20:38:04 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>Für den Upcast braucht man keinen extra cast das geht automatisch...</p>
</blockquote>
<p>Hat ja auch niemand was anderes behauptet. Ich bezog vielmehr auf deine Aussage</p>
<p>FireFlow schrieb:</p>
<blockquote>
<p>... wenn du den Cast wirklich erzwingen musst ...</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/860969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860969</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 29 Aug 2005 20:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Mon, 29 Aug 2005 21:09:47 GMT]]></title><description><![CDATA[<p>Ein static_cast&lt;&gt; kann aber keine Pointer zu andern Pointern casten... Oder rede ich schon wieder von was anderem?</p>
<pre><code class="language-cpp">int * i = new int;
	char * c = static_cast&lt;char*&gt;(i); // BOOM!
	delete i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/860982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860982</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 29 Aug 2005 21:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Casting-Arten für z.B. Pointers on Tue, 30 Aug 2005 05:58:43 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>Ein static_cast&lt;&gt; kann aber keine Pointer zu andern Pointern casten...</p>
</blockquote>
<p>Das stimmt so nicht ganz. Du kannst von und in void Zeiger casten.</p>
<p>FireFlow schrieb:</p>
<blockquote>
<p>Oder rede ich schon wieder von was anderem?</p>
</blockquote>
<p>Ja, das tust du. Wir hatten über Polymorphie gesprochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/861061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861061</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 30 Aug 2005 05:58:43 GMT</pubDate></item></channel></rss>