<?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[Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a]]></title><description><![CDATA[<p>Hallo, ich habe folgende 3 Klassen und will davon gültige, eigenständige Kopien erzeugen. Das hier ist das erste Mal, dass ich den Kopierkonstruktor praktisch anwenden will, deswegen würde ich eure Hilfe bei folgenden Fragen sehr schätzen:</p>
<p>1, Werden meine Objekte mit den diesen Kopierkonstruktoren ordentlich kopiert oder gesliced? (=nur Kopierkonstruktor von Basisklasse wird benutzt)<br />
2, Ist das der richtige Weg an so ein Problem heranzugehen?<br />
3, (eine nicht zum Titel passende Frage die im Code an der betreffenden Stelle dabeisteht.)</p>
<p>btw, ich habe auch operator= überladen, lasse das aber erstmal raus weil ich mir nicht sicher bin ob ich das überhaupt brauche. Die Implementierung sollte sowieso genau gleich aussehen wie der Kopierkonstruktor.<br />
**<br />
SpriteObject**</p>
<pre><code class="language-cpp">class SpriteObject {
     public:
        LPDIRECT3DTEXTURE9 texture;
        SpriteObject::SpriteObject(const SpriteObject&amp; obj);
};
SpriteObject::SpriteObject(const SpriteObject&amp; obj)
{ 

	texture = obj.texture;
}
</code></pre>
<p><strong>Sprite</strong></p>
<pre><code class="language-cpp">class Sprite : public SpriteObject {
    public:
        int volacity;
        Sprite(const Sprite&amp; spt);
};
Sprite::Sprite(const Sprite&amp; spt):SpriteObject(spt)
{
	this-&gt;volacity = spt.volacity;

}
</code></pre>
<p><strong>Enemy</strong></p>
<pre><code class="language-cpp">class Enemy : public Sprite {
    public:
	list&lt;Shot*&gt; shots;
	SpriteObject*      ammo;
        Enemy(const Enemy&amp; e);
};
Enemy::Enemy(const Enemy&amp; e):Sprite(e)
{	
/*---Compiler Fehler bei Iterator Deklaration------
cannot convert from 'std::list&lt;_Ty&gt;::_Const_iterator&lt;_Secure_validation&gt;' to 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'
*/
	list&lt;Shot*&gt;::iterator i = e.shots.begin(); 
	for ( ; i != e.shots.end() ; )
	{
		this-&gt;shots.push_back((*i)++);

	}
}
</code></pre>
<p>Vielen Dank für eure Bemühungen, bin für alle Vorschläge und Gedanken offen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235287/kopierkonstruktor-in-einer-3-klassen-hierarchie-mit-is-a-und-has-a</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 06:23:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235287.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Feb 2009 22:40:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Fri, 27 Feb 2009 22:40:16 GMT]]></title><description><![CDATA[<p>Hallo, ich habe folgende 3 Klassen und will davon gültige, eigenständige Kopien erzeugen. Das hier ist das erste Mal, dass ich den Kopierkonstruktor praktisch anwenden will, deswegen würde ich eure Hilfe bei folgenden Fragen sehr schätzen:</p>
<p>1, Werden meine Objekte mit den diesen Kopierkonstruktoren ordentlich kopiert oder gesliced? (=nur Kopierkonstruktor von Basisklasse wird benutzt)<br />
2, Ist das der richtige Weg an so ein Problem heranzugehen?<br />
3, (eine nicht zum Titel passende Frage die im Code an der betreffenden Stelle dabeisteht.)</p>
<p>btw, ich habe auch operator= überladen, lasse das aber erstmal raus weil ich mir nicht sicher bin ob ich das überhaupt brauche. Die Implementierung sollte sowieso genau gleich aussehen wie der Kopierkonstruktor.<br />
**<br />
SpriteObject**</p>
<pre><code class="language-cpp">class SpriteObject {
     public:
        LPDIRECT3DTEXTURE9 texture;
        SpriteObject::SpriteObject(const SpriteObject&amp; obj);
};
SpriteObject::SpriteObject(const SpriteObject&amp; obj)
{ 

	texture = obj.texture;
}
</code></pre>
<p><strong>Sprite</strong></p>
<pre><code class="language-cpp">class Sprite : public SpriteObject {
    public:
        int volacity;
        Sprite(const Sprite&amp; spt);
};
Sprite::Sprite(const Sprite&amp; spt):SpriteObject(spt)
{
	this-&gt;volacity = spt.volacity;

}
</code></pre>
<p><strong>Enemy</strong></p>
<pre><code class="language-cpp">class Enemy : public Sprite {
    public:
	list&lt;Shot*&gt; shots;
	SpriteObject*      ammo;
        Enemy(const Enemy&amp; e);
};
Enemy::Enemy(const Enemy&amp; e):Sprite(e)
{	
/*---Compiler Fehler bei Iterator Deklaration------
cannot convert from 'std::list&lt;_Ty&gt;::_Const_iterator&lt;_Secure_validation&gt;' to 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'
*/
	list&lt;Shot*&gt;::iterator i = e.shots.begin(); 
	for ( ; i != e.shots.end() ; )
	{
		this-&gt;shots.push_back((*i)++);

	}
}
</code></pre>
<p>Vielen Dank für eure Bemühungen, bin für alle Vorschläge und Gedanken offen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671688</guid><dc:creator><![CDATA[FriedenEuchAllen]]></dc:creator><pubDate>Fri, 27 Feb 2009 22:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Fri, 27 Feb 2009 22:52:53 GMT]]></title><description><![CDATA[<p>Wenn du in Konstruktoren Member initialisierst, solltest du die Initialisierungsliste verwenden. Das gilt auch für Kopierkonstruktoren. Also statt der Zuweisung wie hier:</p>
<pre><code class="language-cpp">SpriteObject::SpriteObject(const SpriteObject&amp; obj)
{ 
    texture = obj.texture;
}
</code></pre>
<p>machst du Folgendes:</p>
<pre><code class="language-cpp">SpriteObject::SpriteObject(const SpriteObject&amp; obj)
: texture(obj.texture)
{ 

}
</code></pre>
<p>Aber wenn keine Deep-Copy nötig ist, also wenn nur Member für Member kopiert wird, kannst du die Implementierung auch weglassen, da reicht der compiler-generierte Kopierkonstruktor.</p>
<p>Zu deinem Iteratorproblem: Der Parameter des Kopierkonstruktors ist eine <strong>Const</strong>-Referenz auf <code>Enemy</code> . Das bedeutet, dass du das referenzierte Objekt nicht verändern darfst. Du kannst also nicht mit einem normalen Iterator iterieren, da dieser die Sequenz manipulieren könnte. Stattdessen nimmst du einen <code>const_iterator</code> , um nur lesend zuzugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671697</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 27 Feb 2009 22:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Fri, 27 Feb 2009 22:56:13 GMT]]></title><description><![CDATA[<p>1. Kommt darauf an, wie du kopierst. Wenn du ein Enemy Objekt kopierst, dann wird eine Kopie vom ganzen Enemy Objekt durchgeführt, also auch die Basisklassen. Wenn du eine Basisklasse kopierst, dann wird nur die Basisklasse und deren Basisklassen kopiert, also womöglich Enemy nicht korrekt und vollständig kopiert.<br />
Falls du von der Basisklasse aus eine vollständige Kopie erreichen willst, kommst du um eine virtuelle <code>clone</code> Funktion nicht herum.<br />
2. Die Frage ist, was ist dein Problem? <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="🙂"
    /><br />
Zum Kopieren selber:<br />
Du machst nichts anderes, als das was der Kompiler automatisch für dich implementieren würde. Ausser das du vergessen hast, auch die Munition zu kopieren, dass hätte der Kompiler nicht vergessen. Es ist allerdings fraglich, ob du wirklich dies haben willst. Denn so wie du es gemacht hast, werden sich zwei Enemy Objekte nach der Kopie ihre Textur und Schüsse Teilen, da sie jeweils Zeiger auf den gleichen Speicher besitzen.<br />
Ich weiss nicht, wie ein Programm aufgebaut ist, aber oft will man sowas verhindern und jedes Objekt soll nach der Kopie auch intern seine eigenen Objekte haben. Das ist auch einer der Gründe, wieso man diese Konstruktoren selber implementieren möchte.<br />
3. <code>e</code> (eine extrem vielsagende Variabel!) ist konstant, also ist <code>e.shots</code> konstant, also liefert <code>e.shots.begin()</code> einen konstanten Iterator, den du natürlich nicht einem nicht konstanten Iterator zuweisen kannst (Tipp: <code>const_iterator</code> ).<br />
4. <a href="http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)" rel="nofollow">http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)</a><br />
5. <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-218760-and-highlight-is-swap.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-218760-and-highlight-is-swap.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671701</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 27 Feb 2009 22:56:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Sat, 28 Feb 2009 08:39:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn du in Konstruktoren Member initialisierst, solltest du die Initialisierungsliste verwenden. Das gilt auch für Kopierkonstruktoren. Also statt der Zuweisung wie hier:</p>
</blockquote>
<p>Danke, du hast natürlich recht. Das erspart mir pro Variable einen Defaultkonstruktoraufruf.</p>
<blockquote>
<p>Du machst nichts anderes, als das was der Kompiler automatisch für dich implementieren würde. Ausser das du vergessen hast, auch die Munition zu kopieren, dass hätte der Kompiler nicht vergessen. Es ist allerdings fraglich, ob du wirklich dies haben willst. Denn so wie du es gemacht hast, werden sich zwei Enemy Objekte nach der Kopie ihre Textur und Schüsse Teilen, da sie jeweils Zeiger auf den gleichen Speicher besitzen.</p>
</blockquote>
<p>Ahh, langsam kommt alles zu mir <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="🙂"
    /> ammo sollte jeweils eine eigene Textur haben, die korrekte Implementierung muss also im Enemy Kopierkonstruktor noch das enthalten:</p>
<pre><code>this-&gt;ammo = new SpriteObject(e.filename);
</code></pre>
<p>Die Dreierregel war mir bekannt, aber ganz klar ist mir jetzt nicht wie der operator= funktioniert. Ich brauche eine deep copy. Aber im operator= darf ich keine Kopierkonstruktoren von Basisklassen aufrufen. Muss ich jetzt einfach alle Variablen der Basisklassen (per Setter) neu belegen?<br />
Das funktioniert nämlich nicht, ich bekomme hier folgenden Fehler, aber nur wenn ich den Setter benutze!? Mache ich die Textur public, funktioniert die Geschichte. Kann mir darauf keinen Reim bilden, das ganze sollte ident sein.<br />
(im Enemy operator=)</p>
<pre><code>this-&gt;texture = e.getTexture();
</code></pre>
<blockquote>
<p>1&gt;c:\2dproject\2dproject\2dproject\enemy.cpp(138) : error C2662: 'SpriteObject::getTexture' : cannot convert 'this' pointer from 'const Enemy' to 'SpriteObject &amp;'</p>
</blockquote>
<p>Achja, eine praktische Frage für den (professionellen?) Alltag: Bei mir wachsen die Klassen ziemlich schnell, Enemy hat zb. über ein Dutzend Variablen zur Beschreibung seiner Attribute wie Schnelligkeit, Schusskraft usw usw. Aber ich hab mal von einer Regel gelesen die nur max. 7 Symbole pro Klasse erlaubt -&gt; sonst ist sie unübersichtlich und überladen.<br />
Aber in Computerspielen ist das doch kaum möglich: Wie gesagt muss ein Gegner allerhand an Informationen beinhalten. Die einzige Lösung scheint mir hier Enemy zb. noch von einer zweiten Klasse abzuleiten, nämlich irgendeine allgemeine &quot;Unit&quot; Klasse. Mehrfachvererbung ist aber ein ganz eigenes Problem..jemand eine Idee wie hier die &quot;best practice&quot; ist?</p>
<p>Danke schonmal für eure super Hilfe !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671786</guid><dc:creator><![CDATA[FriedenEuchAllen]]></dc:creator><pubDate>Sat, 28 Feb 2009 08:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Sat, 28 Feb 2009 10:42:27 GMT]]></title><description><![CDATA[<p>FriedenEuchAllen schrieb:</p>
<blockquote>
<p>Die Dreierregel war mir bekannt, aber ganz klar ist mir jetzt nicht wie der operator= funktioniert. Ich brauche eine deep copy. Aber im operator= darf ich keine Kopierkonstruktoren von Basisklassen aufrufen. Muss ich jetzt einfach alle Variablen der Basisklassen (per Setter) neu belegen?</p>
</blockquote>
<p>Lies den Thread, welcher ich angegeben habe bei Punkt 5. Der sagt dir, wie du eine sehr schöne und Exception sichere Implementierung des <code>operator =</code> machen kannst. Und gibt dir dazu auch bekannt, wie man es &quot;traditionell&quot; macht.</p>
<p>FriedenEuchAllen schrieb:</p>
<blockquote>
<p>Achja, eine praktische Frage für den (professionellen?) Alltag: Bei mir wachsen die Klassen ziemlich schnell, Enemy hat zb. über ein Dutzend Variablen zur Beschreibung seiner Attribute wie Schnelligkeit, Schusskraft usw usw. Aber ich hab mal von einer Regel gelesen die nur max. 7 Symbole pro Klasse erlaubt -&gt; sonst ist sie unübersichtlich und überladen.</p>
</blockquote>
<p>Das sind Definitionen die sich überall ein wenig unterscheiden, aber meistens eine gute Richtung angeben, lieber weniger als zuviel.<br />
Um sowas zu erreichen muss man die Daten und Aufgaben aufteilen. Man kann grundsätzlich definieren, dass jede Klasse eine Aufgabe übernehmen soll, sobald sie mehrere Aufgaben übernimmt, sollte sie aufgeteilt werden.<br />
Also überlege dir, was deine Klasse macht, sobald du ein &quot;und&quot; aussprichst, hast du ein gutes Zeichen dafür, dass eine Aufteilung womöglich nicht schlecht wäre <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="🙂"
    /><br />
Sehr grundsätzliche Aufteilungen sind zudem schon mal:<br />
Model &lt;-&gt; View &lt;-&gt; Controller<br />
<a href="http://de.wikipedia.org/wiki/MVC" rel="nofollow">http://de.wikipedia.org/wiki/MVC</a></p>
<p>Mehrfachvererbung sind übrigens gar nicht so schlimm. Schau dir nur nochmals die Regeln in deinem lieblings C++ Buch oder Tutorial an, dann geht sowas ohne Probleme. Dies soll jetzt allerdings nur eine allgemeingültige Aussage sein und heisst nicht, dass Mehrfachvererbung die Lösung bei deinem Problem ist. <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="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671828</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 28 Feb 2009 10:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor in einer 3 Klassen Hierarchie mit is-a und has-a on Sun, 01 Mar 2009 21:58:58 GMT]]></title><description><![CDATA[<p>FriedenEuchAllen schrieb:</p>
<blockquote>
<p>Achja, eine praktische Frage für den (professionellen?) Alltag: Bei mir wachsen die Klassen ziemlich schnell, Enemy hat zb. über ein Dutzend Variablen zur Beschreibung seiner Attribute wie Schnelligkeit, Schusskraft usw usw. Aber ich hab mal von einer Regel gelesen die nur max. 7 Symbole pro Klasse erlaubt -&gt; sonst ist sie unübersichtlich und überladen.</p>
</blockquote>
<p>Du musst dir überlegen, ob die einzelnen Attribute wirklich total unabhängig voneinander sind. Sonst könntest du sie in einzelne Klassen aufteilen, zum Beispiel:</p>
<pre><code class="language-cpp">struct Lage
{
    Vektor      Position;           // eine Vektorklasse
    Vektor      Geschwindigkeit;
    float       Winkel;
};

struct Bewaffnung
{
    WaffenTyp   Waffe;              // ein Enum-Typ
    int         Munition;
    float       Feuerrate;
};
</code></pre>
<p>So kannst du immer weiter zusammenfassen, wodurch du schlussendlich doch auf recht wenige Member kommst. Aber von fixen Regeln wie &quot;mehr als 7 Membervariablen sind schlecht&quot; halte ich grundsätzlich nicht viel. Ach ja, ich würde den <code>struct</code> s noch Konstruktoren hinzufügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672545</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Mar 2009 21:58:58 GMT</pubDate></item></channel></rss>