<?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[Vererbung, Composite - Kein Casting?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab folgendes Problem:<br />
Für ein kleines Programm, das in Archiven rumwühlt, habe ich eine virtuelle Dateistruktur erstellt, die aus dem Header geladen und im Fenster dargestellt wird. Dazu verwende ich das Composite-Muster, d.h. es gibt eine Basisklasse fsNode und davon abgeleitete Klassen fsDirectory und fsFile. Jedes Element (Verzeichnis und Datei) im Archiv wird nun einer der beiden Klassen zugeordnet. Nun gebe ich dem fsDirectory einen Vector&lt;fsNode&gt;, in dem die Inhalte gespeichert werden sollen, unabhängig davon, ob es Datei oder Directory ist.</p>
<pre><code class="language-cpp">fsDirectory dummy;
	for (int i = 0; i &lt; contents.size(); i++){
		if (contents.at(i).getName() == name){
			dummy = contents.at(i);
			return dummy;
		}
	}
</code></pre>
<p>Wenn ich jetzt in Zeile 4 ein Element aus vector&lt;fsNode&gt; in den Dummy kopieren will, dann meckert der Compiler (VS2005) &quot;there is no acceptable&quot; conversion. Wie schaff ich es nun, dieses fsNode-Objekt - von dem ich weiß, dass es eigentlich ein fsDirectory ist - in ein fs Directory zu casten?</p>
<p>gruß Martin</p>
<p>P.S.: Bin eigentlich Java-Programmierer und beschäftige mich nun mit C++. Gibt es für o.g. Problem ggf. elegantere Lösungen unter C++? Probiere vieles so aus, wie ich es von Java gewohnt bin...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175147/vererbung-composite-kein-casting</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:40:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175147.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Mar 2007 15:17:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:17:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab folgendes Problem:<br />
Für ein kleines Programm, das in Archiven rumwühlt, habe ich eine virtuelle Dateistruktur erstellt, die aus dem Header geladen und im Fenster dargestellt wird. Dazu verwende ich das Composite-Muster, d.h. es gibt eine Basisklasse fsNode und davon abgeleitete Klassen fsDirectory und fsFile. Jedes Element (Verzeichnis und Datei) im Archiv wird nun einer der beiden Klassen zugeordnet. Nun gebe ich dem fsDirectory einen Vector&lt;fsNode&gt;, in dem die Inhalte gespeichert werden sollen, unabhängig davon, ob es Datei oder Directory ist.</p>
<pre><code class="language-cpp">fsDirectory dummy;
	for (int i = 0; i &lt; contents.size(); i++){
		if (contents.at(i).getName() == name){
			dummy = contents.at(i);
			return dummy;
		}
	}
</code></pre>
<p>Wenn ich jetzt in Zeile 4 ein Element aus vector&lt;fsNode&gt; in den Dummy kopieren will, dann meckert der Compiler (VS2005) &quot;there is no acceptable&quot; conversion. Wie schaff ich es nun, dieses fsNode-Objekt - von dem ich weiß, dass es eigentlich ein fsDirectory ist - in ein fs Directory zu casten?</p>
<p>gruß Martin</p>
<p>P.S.: Bin eigentlich Java-Programmierer und beschäftige mich nun mit C++. Gibt es für o.g. Problem ggf. elegantere Lösungen unter C++? Probiere vieles so aus, wie ich es von Java gewohnt bin...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241033</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:22:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">*reinterpret_cast&lt;fsDirectory*&gt;(&amp;fsNode-Objekt);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1241039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241039</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:27:43 GMT]]></title><description><![CDATA[<p>error C2440: 'reinterpret_cast' : cannot convert from 'fsNode' to 'fsDirectory'<br />
Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast</p>
<p>Sagt der VS2005-Compiler dazu. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241044</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:28:59 GMT]]></title><description><![CDATA[<p>1. vector&lt;fsnode&gt; ist schlecht. Wenn du polymorphe Objekte by-value kopierst -- wie hier, wenn du sie z.B. in den Vektor einfügst -- wird tatsächlich nur das Basisklassenobjekt eingefügt. Das heißt, ein fsFile-Objekt wird auf seinen fsNode-Anteil zurechtgestutzt (&quot;slicing&quot;). Daher: polymorphe Objekte immer per Zeiger oder Referenz herumreichen.</p>
<p>2. reinterpret_cast ist hier nicht angebracht. Du kannst entweder dynamic_cast anwenden, wenn du nicht sicher bist, dass der Cast sicher ist. Du bekommst dann einen Nullpointer bzw. eine Exception, wenn der Cast nicht durchgeführt werden kann, weil das dahinterliegende Objekt doch nicht das ist was du erwartet hattest. Wenn du dir aus irgendwelchen Gründen ganz sicher bist, dass der Cast klappt, kannst du auch static_cast benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241047</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:37:08 GMT]]></title><description><![CDATA[<p>Aha, das klingt gut. Ein Verhalten, dass ich nicht erwartet hätte, mit dem ich aber leben kann.</p>
<p>Würde dann einfach einen vector&lt;fsNode*&gt; machen, in dem ich die Zeiger sammele. Und dann neue Objekte mit</p>
<pre><code class="language-cpp">fsDirectory *dummy = new fsDirectory(...);
contents.push_back(dummy);
</code></pre>
<p>einfügen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241060</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:42:20 GMT]]></title><description><![CDATA[<p>Genau. delete nicht vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241065</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 15:48:16 GMT]]></title><description><![CDATA[<p>Ok, das würd ich dann spontan so machen (um den ganzen Vector aufzuräumen):</p>
<pre><code class="language-cpp">fsDirectory::~fsDirectory(){
	fsNode* dummy;
	for(size_t i = 0; i &lt; contents.size(); i++){
		dummy = contents.at(i);
		delete dummy;		
	}
	contents.clear();
}
</code></pre>
<p>Bin mir aber nicht sicher, was der vector davon hält, wenn ich ihm die Pointer unter der Nase wegdelete. Zerstöre ich eigentlich den Pointer mit delete oder nur den Speicherbereich, auf den der Pointer weist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241069</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 16:00:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">fsDirectory::~fsDirectory(){
	for(size_t i = 0; i &lt; contents.size(); i++)
		delete contents[i];
}
</code></pre>
<p>so reichts auch.</p>
<p>mad_martin schrieb:</p>
<blockquote>
<p>Bin mir aber nicht sicher, was der vector davon hält, wenn ich ihm die Pointer unter der Nase wegdelete.</p>
</blockquote>
<p>Das ist ihm egal. Er verwaltet die Pointer, nicht dass, worauf du damit zeigen willst.</p>
<blockquote>
<p>Zerstöre ich eigentlich den Pointer mit delete oder nur den Speicherbereich, auf den der Pointer weist?</p>
</blockquote>
<p>Nur das Objekt, auf das der Zeiger zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241084</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 07 Mar 2007 16:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung, Composite - Kein Casting? on Wed, 07 Mar 2007 16:06:45 GMT]]></title><description><![CDATA[<p>Danke sehr!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241095</guid><dc:creator><![CDATA[mad_martin]]></dc:creator><pubDate>Wed, 07 Mar 2007 16:06:45 GMT</pubDate></item></channel></rss>