<?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[Zeiger kopieren]]></title><description><![CDATA[<p>Hallo. Ich habe schon kurz gegooglet, aber aufgrund der Mangelnden Zeit habe ich keine Zeit für ausführliche Recherchen.</p>
<p>Ich habe in einer <code>map</code> Zeiger auf auf meine Basisklasse.</p>
<p>Deklaration:</p>
<pre><code class="language-cpp">std::map&lt;Block_ID, Block*&gt; BLOCKS;
</code></pre>
<p>An einer anderen Stelle weiße ich <code>Block*</code> eine abgeleitete Klasse <code>Block_Air*</code> zu.</p>
<pre><code class="language-cpp">BLOCKS[Block_ID(0)] = new Block_Air();
</code></pre>
<p>Und während der Laufzeit möchte ich, dass der Zeiger kopiert wird und dann in einem anderen zeiger gespeichert wird.</p>
<pre><code class="language-cpp">Block* block = BLOCKS[Block_ID(0)];
</code></pre>
<p>Wenn ich das mache, dann hat <code>block</code> den gleichen Zeiger wie <code>BLOCKS[Block_ID(0)]</code> . Wie kann ich machen, dass in <code>block</code> eine Kopie von <code>BLOCKS[Block_ID(0)]</code> gespeichert wird, also dass ein neues Objekt von z.B. <code>Block_Air</code> erzeugt wird???</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302835/zeiger-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 03:12:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302835.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Apr 2012 12:49:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 12:49:13 GMT]]></title><description><![CDATA[<p>Hallo. Ich habe schon kurz gegooglet, aber aufgrund der Mangelnden Zeit habe ich keine Zeit für ausführliche Recherchen.</p>
<p>Ich habe in einer <code>map</code> Zeiger auf auf meine Basisklasse.</p>
<p>Deklaration:</p>
<pre><code class="language-cpp">std::map&lt;Block_ID, Block*&gt; BLOCKS;
</code></pre>
<p>An einer anderen Stelle weiße ich <code>Block*</code> eine abgeleitete Klasse <code>Block_Air*</code> zu.</p>
<pre><code class="language-cpp">BLOCKS[Block_ID(0)] = new Block_Air();
</code></pre>
<p>Und während der Laufzeit möchte ich, dass der Zeiger kopiert wird und dann in einem anderen zeiger gespeichert wird.</p>
<pre><code class="language-cpp">Block* block = BLOCKS[Block_ID(0)];
</code></pre>
<p>Wenn ich das mache, dann hat <code>block</code> den gleichen Zeiger wie <code>BLOCKS[Block_ID(0)]</code> . Wie kann ich machen, dass in <code>block</code> eine Kopie von <code>BLOCKS[Block_ID(0)]</code> gespeichert wird, also dass ein neues Objekt von z.B. <code>Block_Air</code> erzeugt wird???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206357</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Sat, 28 Apr 2012 12:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 13:05:17 GMT]]></title><description><![CDATA[<p>In der Block KLasse:</p>
<pre><code class="language-cpp">class Block {
  public:
    virtual Block* clone() = 0;
};
</code></pre>
<p>In BlockAir und allen anderen Klassen, die von Block abgeleitet sind:</p>
<pre><code class="language-cpp">class BlockAir: public Block {
  public:
    virtual Block* clone() { return new BlockAir(*this); }
};
</code></pre>
<p>Edit:<br />
Alternative: (Ich bin nicht ganz sicher ob das erlaubt ist)</p>
<pre><code class="language-cpp">class BaseBlock {  //Zeiger auf diese Klasse in der Map speichern
  public:
    // Gemeinsames Interface aller Blöcke
    // ...
    virtual BaseBlock* clone() const = 0;
    // Virtueller Destruktor
  private:
    // Konstruktor hier
    template &lt;class&gt;
    friend Cloneable;
};

template &lt;class Child&gt;
class Block { // Alle Blocktypen erben von dieser Klasse. Sie müssen nichts
              // anderes machen.
  public:
    virtual BaseBlock* clone() const { return new Child(*static_cast&lt;Child*&gt;(this)); }
    // Mit c++11
    // virtual BaseBlock* clone() const final override { return new Child(*static_cast&lt;Child*&gt;(this) ); }
  protected:
    Block() {} // Oder mit C++11: Block() = default.
    virtual ~Block() {} // Oder mit C++11: virtual ~Block() = default;
};
</code></pre>
<p>Benutzung (gilt für beider Varianten) :</p>
<pre><code class="language-cpp">Block * ptr = new BlockAir(); // Für Variante 2 : BaseBlock * ptr
  Block * ptr2 = ptr -&gt; clone();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2206360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206360</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Sat, 28 Apr 2012 13:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 14:07:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27772">@pyhax</a>: Der Returntyp in der abgeleiteten Klasse braucht nicht identisch zu sein mit dem in der Basisklasse, er darf auch spezialisierter sein. Du kannst also ganz korrekt einen Block* zurückgeben. Dies erspart dir möglicherweise ein paar dynamic_casts o.Ä. falls du mal direkt einen Block* kopieren möchtest. Das Stichwort dazu ist &quot;Covariant return types&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206375</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 28 Apr 2012 14:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 15:19:17 GMT]]></title><description><![CDATA[<p>Die erste Variante von phyax funktioniert.</p>
<p>Jetzt habe ich ein anderes Problem:</p>
<p>Ich habe in meienr <code>World</code> -Klasse ein Array:</p>
<pre><code class="language-cpp">Chunk chunks[64][64][16];
</code></pre>
<p><code>Chunk</code> hat aber nur einen Konstruktor (und das mit gutem Grund!)</p>
<pre><code class="language-cpp">Chunk(World* welt);
</code></pre>
<p>Ich würde das gerne so lösen:</p>
<pre><code class="language-cpp">class World
{
private:
	Chunk chunks[64][64][16](this);

//Der ganze Rest
};
</code></pre>
<p>Das geht aber nicht!</p>
<p>Wie könnte ich das lösen?<br />
(Ohne einen neuen Konstruktor!!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206376</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Sat, 28 Apr 2012 15:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 14:55:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27772">@pyhax</a>: Der Returntyp in der abgeleiteten Klasse braucht nicht identisch zu sein mit dem in der Basisklasse, er darf auch spezialisierter sein. Du kannst also ganz korrekt einen Block* zurückgeben. Dies erspart dir möglicherweise ein paar dynamic_casts o.Ä. falls du mal direkt einen Block* kopieren möchtest. Das Stichwort dazu ist &quot;Covariant return types&quot;.</p>
</blockquote>
<p>Block ist doch ein Template, das heißt ich müsste doch dann sowieso den Typ des Objektes kennen, und dann kann ich doch gleich einen Static_cast verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206389</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Sat, 28 Apr 2012 14:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 15:10:16 GMT]]></title><description><![CDATA[<p>Wie ja schon gesagt, deine erster Variante funktioniert.</p>
<p>Könntet ihr euch vieleicht auf das andere (neue) Problem konzentrieren!<br />
Oder soll ich einen neuen Thred aufmachen???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206400</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Sat, 28 Apr 2012 15:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 15:12:24 GMT]]></title><description><![CDATA[<p>Nein. &quot;Das geht aber nicht.&quot; ist keine Fehlerbeschreibung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206404</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 28 Apr 2012 15:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 15:19:02 GMT]]></title><description><![CDATA[<p>Es geht nicht.</p>
<p>Das heißt, in der Form, in der ich es machen will, lässt mich der Kompiler das nicht machen.</p>
<pre><code>e:\eigene dateien\visual studio 2010\projects\block forge\map\world.h(12): error C2059: Syntaxfehler: 'this'
e:\eigene dateien\visual studio 2010\projects\block forge\map\world.h(12): error C2092: 'chunks' Arrayelementtyp kann keine Funktion sein
  World.cpp
e:\eigene dateien\visual studio 2010\projects\block forge\map\world.h(12): error C2059: Syntaxfehler: 'this'
e:\eigene dateien\visual studio 2010\projects\block forge\map\world.h(12): error C2092: 'chunks' Arrayelementtyp kann keine Funktion sein
</code></pre>
<p>Syntaxfehler! =&gt; Geht so nicht!</p>
<p>P.S.: Ich hab im (letzten) Code(-auschnitt) vergessen die Klammern nach <code>...[16]</code> zu setzten. Jetzt stimmts!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206405</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Sat, 28 Apr 2012 15:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 15:52:02 GMT]]></title><description><![CDATA[<p>Ich denke da musst du einen Defaultknstruktor hinzufügen. Warum willst du das nbedingt veremeiden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206426</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Sat, 28 Apr 2012 15:52:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger kopieren on Sat, 28 Apr 2012 16:15:28 GMT]]></title><description><![CDATA[<p>Weil sonst aus ungeklärten Gründen die Objekte nicht erzeugt werden!</p>
<p>Od das obwohl ich nachträglich nochmals den gewünschten Konstruktor aufrufe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206436</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Sat, 28 Apr 2012 16:15:28 GMT</pubDate></item></channel></rss>