<?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[Fragen zum dynamischen Erzeugen von Objekten]]></title><description><![CDATA[<p>Ich habe ein, zwei kleinere Verständnissprobleme mit C++.<br />
Ich vereinfache mein Beispiel mal:</p>
<p>Ich habe eine Klasse &quot;Schueler&quot;:</p>
<pre><code>class Schueler
{
protected:
	std::string Name;
	int Alter;
public:
	Schueler (std::string name, int alter) : Name(name), Alter(alter) { /* empty */ }
	~Schueler();
	std::string getName(void);
};
</code></pre>
<p>Davon abgeleitet habe ich zwei Klassen, &quot;Grundschueler&quot; und &quot;Hauptschueler&quot;:</p>
<pre><code>class Grundschueler : Schueler
{
	/* Grundschueler Attribute */
public:
	Grundschueler (std::string name, int alter);
	~Grundschueler();
};

class Hauptschueler : Schueler
{
	/* Hauptschueler Attribute */
public:
	Hauptschueler (std::string name, int alter);
	~Hauptschueler();
};
</code></pre>
<p>Außerdem gibt es eine Schule, diese &quot;besitzt&quot; mehrere Schüler:</p>
<pre><code>class Schule
{
	std::map&lt;std::string, Schueler*&gt; schueler;
public:
	Schule (std::string name);
	~Schule();	
	void addSchueler(std::string name, int Alter);
};
</code></pre>
<p>Dazu jetzt also paar Fragen:</p>
<ol>
<li>
<p>die Methode &quot;addSchueler()&quot; entscheidet, ob der neue Schüler ein Grund- oder Hauptschüler ist und erstellt diesen mittels &quot;new&quot;.<br />
Der resultierende Zeiger soll in die &quot;schueler&quot;-Map abgelegt werden. Allerdings meckert hier der Compiler: anscheinend kann der Container wirklich nur Schueler aufnehmen, allerdings keine davon abgeleiteten Klassen. Verwende ich bei der Deklaration der Kinder-Klassen das Keywort &quot;public&quot; bei der Vererbung klappt es. Wieso?<br />
Ich dachte, dieses Keywort entscheidet nur über die Sichtbarkeit von Membern. Aber ein Grundschueler ist doch ein Schueler, Sichtbarkeit hin oder her, und müsste sich doch in den Container packen lassen... Zumindest dachte ich das.</p>
</li>
<li>
<p>Wird die Schule zerstört entsteht natürlich ein Speicherleck!<br />
Also müssen im Destruktor von &quot;Schule&quot; erstmal alle Schueler zerstört werden. Dafür iteriere ich über die Map und lösche jeden Eintrag von Hand:</p>
</li>
</ol>
<pre><code>Schule::~Schule()
{
	std::map&lt;std::string, Schueler*&gt;::iterator it;

	for (std::map&lt;std::string, Schueler*&gt;::iterator it=schueler.begin(); it!=schueler.end(); ++it)
		delete (it-&gt;second);
}
</code></pre>
<p>Passt das so oder macht man das anders? Gibts da schönere Ansätze?</p>
<ol start="3">
<li>Diese Frage bezieht sich eigentlich auf meine zweite.<br />
Da der Container eigentlich nur Schueler aufnimmt wird beim delete-Aufruf jeweils nur der Schueler-Destruktor ausgeführt. In Wahrheit befinden sich im Container aber Grundschueler und Hauptschueler! D.h. bei jedem delete-Aufruf müssten eigentlich zwei Destruktoren ausgeführt werden (erst vom jeweiligen Kind, dann von &quot;Schueler&quot;).<br />
Wie löse ich das? Casten? Wenn ja, woher bekomme ich den genauen Typ zu dem gecastet werden muss?</li>
</ol>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324021/fragen-zum-dynamischen-erzeugen-von-objekten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 15:26:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324021.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Feb 2014 08:31:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 08:31:24 GMT]]></title><description><![CDATA[<p>Ich habe ein, zwei kleinere Verständnissprobleme mit C++.<br />
Ich vereinfache mein Beispiel mal:</p>
<p>Ich habe eine Klasse &quot;Schueler&quot;:</p>
<pre><code>class Schueler
{
protected:
	std::string Name;
	int Alter;
public:
	Schueler (std::string name, int alter) : Name(name), Alter(alter) { /* empty */ }
	~Schueler();
	std::string getName(void);
};
</code></pre>
<p>Davon abgeleitet habe ich zwei Klassen, &quot;Grundschueler&quot; und &quot;Hauptschueler&quot;:</p>
<pre><code>class Grundschueler : Schueler
{
	/* Grundschueler Attribute */
public:
	Grundschueler (std::string name, int alter);
	~Grundschueler();
};

class Hauptschueler : Schueler
{
	/* Hauptschueler Attribute */
public:
	Hauptschueler (std::string name, int alter);
	~Hauptschueler();
};
</code></pre>
<p>Außerdem gibt es eine Schule, diese &quot;besitzt&quot; mehrere Schüler:</p>
<pre><code>class Schule
{
	std::map&lt;std::string, Schueler*&gt; schueler;
public:
	Schule (std::string name);
	~Schule();	
	void addSchueler(std::string name, int Alter);
};
</code></pre>
<p>Dazu jetzt also paar Fragen:</p>
<ol>
<li>
<p>die Methode &quot;addSchueler()&quot; entscheidet, ob der neue Schüler ein Grund- oder Hauptschüler ist und erstellt diesen mittels &quot;new&quot;.<br />
Der resultierende Zeiger soll in die &quot;schueler&quot;-Map abgelegt werden. Allerdings meckert hier der Compiler: anscheinend kann der Container wirklich nur Schueler aufnehmen, allerdings keine davon abgeleiteten Klassen. Verwende ich bei der Deklaration der Kinder-Klassen das Keywort &quot;public&quot; bei der Vererbung klappt es. Wieso?<br />
Ich dachte, dieses Keywort entscheidet nur über die Sichtbarkeit von Membern. Aber ein Grundschueler ist doch ein Schueler, Sichtbarkeit hin oder her, und müsste sich doch in den Container packen lassen... Zumindest dachte ich das.</p>
</li>
<li>
<p>Wird die Schule zerstört entsteht natürlich ein Speicherleck!<br />
Also müssen im Destruktor von &quot;Schule&quot; erstmal alle Schueler zerstört werden. Dafür iteriere ich über die Map und lösche jeden Eintrag von Hand:</p>
</li>
</ol>
<pre><code>Schule::~Schule()
{
	std::map&lt;std::string, Schueler*&gt;::iterator it;

	for (std::map&lt;std::string, Schueler*&gt;::iterator it=schueler.begin(); it!=schueler.end(); ++it)
		delete (it-&gt;second);
}
</code></pre>
<p>Passt das so oder macht man das anders? Gibts da schönere Ansätze?</p>
<ol start="3">
<li>Diese Frage bezieht sich eigentlich auf meine zweite.<br />
Da der Container eigentlich nur Schueler aufnimmt wird beim delete-Aufruf jeweils nur der Schueler-Destruktor ausgeführt. In Wahrheit befinden sich im Container aber Grundschueler und Hauptschueler! D.h. bei jedem delete-Aufruf müssten eigentlich zwei Destruktoren ausgeführt werden (erst vom jeweiligen Kind, dann von &quot;Schueler&quot;).<br />
Wie löse ich das? Casten? Wenn ja, woher bekomme ich den genauen Typ zu dem gecastet werden muss?</li>
</ol>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385489</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 08:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 08:42:58 GMT]]></title><description><![CDATA[<p>Grundsätzlich fällt mir auf, dass zumindest der ctor virtual sein sollte, damit der &quot;richtige&quot; aufgerufen wird.</p>
<p>Ansonsten hier weiteres zur Vererbung<br />
<a href="http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung" rel="nofollow">http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung</a><br />
siehe dort unter:</p>
<p>Zugriffskontrolle</p>
<p>Die Vererbungsart zeigt an, ob beim Vererben der Zugriff auf Elemente der Basisklasse eingeschränkt wird. Sie wird vor dem Namen der Basisklasse angegeben. Wie bei Memberdeklarationen gibt es die Schlüsselwörter public, protected und private (Standard-Vererbungsart). Die Deklarationen</p>
<p>class A { /* ... <em>/ };<br />
class B : public A { /</em> ... <em>/ };<br />
class C : protected A { /</em> ... <em>/ };<br />
class D : private A { /</em> ... <em>/ }; // (oder (Standard-Vererbungsart): &quot;class D : A { /</em> ... */ };&quot;)<br />
bewirken folgendes:</p>
<p>Ist ein Element in A public protected private<br />
... wird es in B public protected unzugänglich<br />
... wird es in C protected protected unzugänglich<br />
... wird es in D private private unzugänglich</p>
<p>Beachten Sie, dass friend-Beziehungen nicht vererbt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385491</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 27 Feb 2014 08:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:01:08 GMT]]></title><description><![CDATA[<p>Nimm Smart Pointer, dann hast du mit dem delete kein Problem mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385495</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:19:02 GMT]]></title><description><![CDATA[<p>Helmut.Jakoby schrieb:</p>
<blockquote>
<p>Grundsätzlich fällt mir auf, dass zumindest der ctor virtual sein sollte, damit der &quot;richtige&quot; aufgerufen wird.</p>
</blockquote>
<p>Nein, falsch. Konstruktoren können niemals virtuell sein, was du wahrscheinlich meinst ist der Destruktor. Wennd er virtuell ist wird &quot;automatisch&quot; der Unterklassendestruktor aufgerufen</p>
<p>Helmut.Jakoby schrieb:</p>
<blockquote>
<p>Ansonsten hier weiteres zur Vererbung<br />
<a href="http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung" rel="nofollow">http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung</a><br />
siehe dort unter:<br />
[...]<br />
Beachten Sie, dass friend-Beziehungen nicht vererbt werden.</p>
</blockquote>
<p>Vererbung ist ein Konzept mit dem Beziehungen ausgedrückt werden können.<br />
Öffentliche vererbung (und damit eigentlich, was der Volksmund darunter versteht) ist: Derive erbt öffentlich von Base --&gt; Derive ist ein Base</p>
<p>Scott Meyers geht in seinem Effective C++ hin und formuliert private Vererbung umgangssprachlich:<br />
A erbt privat von B --&gt; A ist mithilfe von B implementiert.<br />
Der grund dafür ist, dass A zwar alles öffentliche von B sieht und darauf zugreifen kann (es also nutzen kann), aber es wird nicht nach außen von A propagiert.</p>
<p>Protected Inheritance ist mir noch nie untergekommen.</p>
<p>Zu deiner weiteren Frage:<br />
Die Zeiger in der Map besitzen die Schueler-Objekte, sind also dafür zuständig sie zu löschen (und auch mithilfe der add Methode zu initialisieren). Da dabei öfters mal was scheifgehen kann, nutzt man das RAII Konzept. Da googlest du am Besten mal nach. (Für manch einen ist genau dieses Konzept der Grund, warum C++ so geil ist und was es von den meisten anderen Sprachen abhebt).</p>
<p>Kurzum, nutze sogenannte Smart-Pointer:</p>
<pre><code>class Schule
{
    std::map&lt;std::string, std::unique_ptr&lt;Schueler&gt;&gt; schueler;
public:
    Schule (std::string name);
    virtual ~Schule() {} // reicht hier jetzt ;) 
    void addSchueler(std::string name, int Alter)
    {
         // ...
         schueler[name] = std::make_unique&lt;Hauptschueler&gt;(name, alter); // bin mir bei der Syntax von make_unique nicht ganz sicher, sollte aber in etwa hinkommen
        // ...
    }
};
</code></pre>
<p>Der unique_ptr löscht seinen pointee am Ende automatisch und du kannst es nicht nicht vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385502</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:22:46 GMT]]></title><description><![CDATA[<p>Helmut.Jakoby schrieb:</p>
<blockquote>
<p>Grundsätzlich fällt mir auf, dass zumindest der ctor virtual sein sollte, damit der &quot;richtige&quot; aufgerufen wird.</p>
<p>Ansonsten hier weiteres zur Vererbung<br />
<a href="http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung" rel="nofollow">http://de.wikibooks.org/wiki/C++-Programmierung:_Vererbung</a><br />
siehe dort unter:</p>
<p>Zugriffskontrolle</p>
<p>Die Vererbungsart zeigt an, ob beim Vererben der Zugriff auf Elemente der Basisklasse eingeschränkt wird. Sie wird vor dem Namen der Basisklasse angegeben. Wie bei Memberdeklarationen gibt es die Schlüsselwörter public, protected und private (Standard-Vererbungsart). Die Deklarationen</p>
<p>class A { /* ... <em>/ };<br />
class B : public A { /</em> ... <em>/ };<br />
class C : protected A { /</em> ... <em>/ };<br />
class D : private A { /</em> ... <em>/ }; // (oder (Standard-Vererbungsart): &quot;class D : A { /</em> ... */ };&quot;)<br />
bewirken folgendes:</p>
<p>Ist ein Element in A public protected private<br />
... wird es in B public protected unzugänglich<br />
... wird es in C protected protected unzugänglich<br />
... wird es in D private private unzugänglich</p>
<p>Beachten Sie, dass friend-Beziehungen nicht vererbt werden.</p>
</blockquote>
<p>Okok, aber inwiefern beantwortet das eine meiner Fragen?<br />
In Frage 1) schreibe ich doch dass mir grundsätzlich klar ist, was es mit Vererbung und Sichtbarkeit auf sich hat.<br />
Aber wieso nimmt ein Container wie std::map&lt;Schueler&gt; keine &quot;Grundschueler&quot; auf, außer ich mache eine &quot;public&quot; Vererbung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385504</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:22:46 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:35:51 GMT]]></title><description><![CDATA[<p>lugge86 schrieb:</p>
<blockquote>
<p>Aber wieso nimmt ein Container wie std::map&lt;Schueler&gt; keine &quot;Grundschueler&quot; auf, außer ich mache eine &quot;public&quot; Vererbung?</p>
</blockquote>
<p>Weil die Information, dass ein &quot;Hauptschueler&quot; ein &quot;Schueler&quot; *ist*, eben nur bei public Vererbung &quot;nach außen&quot; bekannt ist.</p>
<p>Bei Vererbung braucht man i.d.R. public-Vererbung. Ganz selten mal private (in Sonderfällen, meistens ist Komposition die bessere Wahl).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385507</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:35:51 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:44:11 GMT]]></title><description><![CDATA[<p>Vielen Dank dafür.<br />
Find ich auf den ersten Blick ungewohnt (hab geringe Java-Vorkenntnisse und eine gute Portion C). Dachte das würde sich wirklich nur auf die Sichtbarkeit von Membern beziehen.</p>
<p>Ich lese mich zwar gerade in SmartPointer ein.<br />
Aber aus Interesse: Angenommen ich würde im Desktruktor meiner &quot;Schule&quot;, so wie oben gezeigt, alle Grund- und Hauptschueler per Hand löschen indem ich durch die Map iteriere.</p>
<p>Wie stelle ich bei diesem Vorgehen sicher, dass nicht nur der &quot;Schueler&quot;-Destruktor aufgerufen wird, sondern davor auch der jeweilige &quot;Unterdekonstruktor&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385509</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:44:24 GMT]]></title><description><![CDATA[<p>Wenn</p>
<pre><code>Base* b = new Derived();
</code></pre>
<p>gehen würde, wäre private Vererbung völlig sinnlos, da du mit</p>
<pre><code>Base* b = new Derived();
b-&gt;SomethingThatIsPublicInBase();
</code></pre>
<p>den Zugriffsschutz den du durch private ja haben willst (sonst würdest du ja nicht private schreiben) jederzeit umgehen könntest, und sogar ganz versehentlich oft würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385510</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:44:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:52:06 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Wenn</p>
<pre><code>Base* b = new Derived();
</code></pre>
<p>gehen würde, wäre private Vererbung völlig sinnlos, da du mit</p>
<pre><code>Base* b = new Derived();
b-&gt;SomethingThatIsPublicInBase();
</code></pre>
<p>den Zugriffsschutz den du durch private ja haben willst (sonst würdest du ja nicht private schreiben) jederzeit umgehen könntest, und sogar ganz versehentlich oft würdest.</p>
</blockquote>
<p>Vielen Dank, so macht das natürlich Sinn.<br />
Aber bei public-Vererbung ist mein Vorgehen ja durchaus legitim, oder? Zumindest kompilierts und funktionierts <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/2385513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385513</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:52:50 GMT]]></title><description><![CDATA[<p>lugge86 schrieb:</p>
<blockquote>
<p>Vielen Dank dafür.<br />
Find ich auf den ersten Blick ungewohnt (hab geringe Java-Vorkenntnisse und eine gute Portion C). Dachte das würde sich wirklich nur auf die Sichtbarkeit von Membern beziehen.</p>
<p>Ich lese mich zwar gerade in SmartPointer ein.<br />
Aber aus Interesse: Angenommen ich würde im Desktruktor meiner &quot;Schule&quot;, so wie oben gezeigt, alle Grund- und Hauptschueler per Hand löschen indem ich durch die Map iteriere.</p>
<p>Wie stelle ich bei diesem Vorgehen sicher, dass nicht nur der &quot;Schueler&quot;-Destruktor aufgerufen wird, sondern davor auch der jeweilige &quot;Unterdekonstruktor&quot;?</p>
</blockquote>
<p>Wie gesagt, du machst den Destruktor von Base virtuell. In meinem zitierten Beispiel oben stehts auch drin.</p>
<p>In Java ist es genau anders herum als in C++. Du kannst erstmal jede Methode überschreiben, ausser du verbietest es per final. In C++ kannst du erstmal nix überschreiben (maximal nur überdecken), es sei denn du machst die entsprechende Methode virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385514</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 09:58:02 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Wenn</p>
<pre><code>Base* b = new Derived();
</code></pre>
<p>gehen würde, wäre private Vererbung völlig sinnlos, da du mit</p>
<pre><code>Base* b = new Derived();
b-&gt;SomethingThatIsPublicInBase();
</code></pre>
<p>den Zugriffsschutz den du durch private ja haben willst (sonst würdest du ja nicht private schreiben) jederzeit umgehen könntest, und sogar ganz versehentlich oft würdest.</p>
</blockquote>
<p>Du musst natürlich(*) casten...</p>
<pre><code class="language-cpp">Base* b = (Base*)new Derived;
b-&gt;SomethingThatIsPublicInBase();
</code></pre>
<p>(*) natürlich wie in: &quot;Natürlich ist's in C++ nicht so einfach, wie man denkt.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385515</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 27 Feb 2014 09:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 10:20:37 GMT]]></title><description><![CDATA[<p>Muss ich? Das verwundert mich etwas, oder versteh ich dich grade falsch?</p>
<pre><code>class Foo {};
class Bar : public Foo {};

int main()
{
   Foo* f = new Bar();
}
</code></pre>
<p>Kompiliert, wie ich auch erwarten würde, einwandfrei. (Bis auf eine Warnung das f nicht benutzt wird)</p>
<p>@Lugge<br />
Das ist prinzipiell so ok. Es gibt noch ein paar Fallstricke, in C++ gibt's mit Vererbungs einige eigenarten, die zwar alle ihren Sinn haben aber überraschend sein können. Der virtuelle Destruktor ist wichtig (einfach in virtual ~Schueler();)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385521</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Thu, 27 Feb 2014 10:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 10:29:40 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Muss ich? Das verwundert mich etwas, oder versteh ich dich grade falsch?</p>
</blockquote>
<p>Wohl schon.</p>
<p>Musst Du natürlich nur, wenn Du an die public member einer privat(!) vererbten Klasse ranwillst. Bzw. einen Zeiger auf eine eigentlich &quot;inaccessible base class&quot; brauchst. Implizite Konvertierung zieht hier ja nicht - was ja der Aufhänger des Threads ist.<br />
:</p>
<pre><code class="language-cpp">struct Base{
  void SomethingThatIsPublicInBase(){}
  virtual ~Base(){}
};
struct Derived : private Base{};

int main(){
  Base* b = (Base*)new Derived;
  b-&gt;SomethingThatIsPublicInBase(); // !
  delete b;
}
</code></pre>
<p>Disclaimer: natürlich propagiere ich diesen Weg nicht! <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/2385525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385525</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 27 Feb 2014 10:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 10:30:15 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Der virtuelle Destruktor ist wichtig (einfach in virtual ~Schueler();)</p>
</blockquote>
<p>Ja, habs mittlerweile auch umgeändert und es klappt.</p>
<p>Jetzt werd ich das mal auf SmartPointer umstellen.<br />
Nur, was ich bisher herausgefunden habe: dieses oben genannte make_unique kommt erst in C++14 <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/2385528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385528</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 10:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 10:37:18 GMT]]></title><description><![CDATA[<p>Dann hab ich dich tatsächlich falsch verstanden, du mich aber wohl auch <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 />
Es ging mir ja darum, warum es nicht ohne &quot;tricks&quot; geht das einfach so zuzuweisen.<br />
Mit dem guten alten &quot;Mein lieber Compiler, halt die Klappe und tu was ich sage&quot;-casts kann man das dann wieder schon machen, sollte man aber natürlich nicht. <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/2385529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385529</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Thu, 27 Feb 2014 10:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 11:37:07 GMT]]></title><description><![CDATA[<p>lugge86 schrieb:</p>
<blockquote>
<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Der virtuelle Destruktor ist wichtig (einfach in virtual ~Schueler();)</p>
</blockquote>
<p>Ja, habs mittlerweile auch umgeändert und es klappt.</p>
<p>Jetzt werd ich das mal auf SmartPointer umstellen.<br />
Nur, was ich bisher herausgefunden habe: dieses oben genannte make_unique kommt erst in C++14 <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>
</blockquote>
<p>Welchen Compiler nutzt du denn? Wenn du irgendwas C++11 fähiges nimmst, dann kannst du dir make_unique leicht nachbauen. Bei älteren Compilern ist das nicht mehr so trivial, aber da kannst du dir eine kleine spezialisierte Funktion schnell schreiben. oder du machst es auf herkömmliche Art und Weise und schiebst einen unique_ptr rein, den du on-the-fly oder vorher initialisierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385548</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 27 Feb 2014 11:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 13:27:34 GMT]]></title><description><![CDATA[<p>Soo, ich hab leider noch was:</p>
<p>Wie gesagt, ich sammle meine Grundschueler und Hauptschueler in einer map&lt;Schueler*&gt;</p>
<p>Wenn ich durch die Map iteriere würde ich gerne feststellen, welchen Types denn der aktuelle Zeiger ist.<br />
Ich versuche es mit typeid:</p>
<pre><code>if (typeid(it-&gt;first) == typeid(Grundschueler*))
    cout &lt;&lt; &quot;Grundschueler&quot; &lt;&lt; endl;
</code></pre>
<p>Leider schlägt der Vergleich nie an. An was liegt das?<br />
Kann ich überhaupt anhand des Zeigers aus der Map feststellen, welchen Typ das aktuelle Element hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385569</guid><dc:creator><![CDATA[lugge86]]></dc:creator><pubDate>Thu, 27 Feb 2014 13:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 13:30:09 GMT]]></title><description><![CDATA[<p>lugge86 schrieb:</p>
<blockquote>
<p>Kann ich überhaupt anhand des Zeigers aus der Map feststellen, welchen Typ das aktuelle Element hat?</p>
</blockquote>
<p>Du kannst natürlich per dynamic_cast casten und prüfen, ob der Rückgabewert != NULL ist.</p>
<p>Allerdings: wofür brauchst du das? Spezifisches Verhalten sollte mittels virtueller Methoden implementiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385571</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 27 Feb 2014 13:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 13:31:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich durch die Map iteriere würde ich gerne feststellen, welchen Types denn der aktuelle Zeiger ist.</p>
</blockquote>
<p>Wenn du so etwas wissen möchtest, dann gehören die beiden Typen nicht in eine gemeinsame Liste. Benutz virtuelle Methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385572</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 27 Feb 2014 13:31:52 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zum dynamischen Erzeugen von Objekten on Thu, 27 Feb 2014 14:14:40 GMT]]></title><description><![CDATA[<p>lugge86 schrieb:</p>
<blockquote>
<pre><code>if (typeid(it-&gt;first) == typeid(Grundschueler*))
    cout &lt;&lt; &quot;Grundschueler&quot; &lt;&lt; endl;
</code></pre>
<p>Leider schlägt der Vergleich nie an. An was liegt das?<br />
Kann ich überhaupt anhand des Zeigers aus der Map feststellen, welchen Typ das aktuelle Element hat?</p>
</blockquote>
<p>Wenn du deine map nicht verändert hast(sie also noch eine map&lt;string, schueler*&gt; ist), dann ist das falsch.</p>
<p>Du fragst, ob die typeid von einem String gleich der eines X-Schülers ist. Nein, niemals. Nimm nicht it-&gt;first, sondern it-&gt;second</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385579</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 27 Feb 2014 14:14:40 GMT</pubDate></item></channel></rss>