<?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[reinterpret_cast auf std::vector]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>im Zusammenhang mit einer pure virtual Function, die einen Vektor zurückliefert,<br />
bin ich auf folgendes Problem gestoßen. Ich möchte einen<br />
Vektor von Obst-Objekten zurückliefern, aber in einer Implementierung<br />
habe ich einen Vektor von Äpfeln. Ich hab mal die Argumentation von Stroustrup<br />
gelesen, dass man so etwas nicht casten kann, da ich sonst Bananen in den Apfel-<br />
korb legen kann. Diese Argumentation finde ich auch ziemlich einleuchtend.<br />
Wenn ich jetzt allerdings einen const std::vector&lt;Obst&gt;&amp; zurückliefer, besteht<br />
diese Gefahr ja nicht. Deswegen habe ich jetzt versucht, den std::vector<br />
mit einem reinterpret_cast zu casten. Ich habe das jetzt etwas losgelöst von<br />
meinem eigentlichen Problem versucht. Mir ist klar, dass in dem Code Speicher<br />
nicht freigegeben wird, vector-Kopien erzeugt werden, etc. und in diesem<br />
Fall durch ändern des Rückgabewertes auf Casten verzichtet werden kann.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

class A {
public:
	A(unsigned int i){
		this-&gt;i = i;
	}
	virtual ~A(){}
	unsigned int i;
};

class B : public A {
public:
	B(unsigned int i) : A(i) {
	}
	virtual ~B(){}
};

const std::vector&lt;B*&gt; getVector(){
	std::vector&lt;B*&gt; v;
	v.push_back(new B(1));
	v.push_back(new B(2));
	v.push_back(new B(3));
	return v;
}

const std::vector&lt;B&gt; getVectorB(){
	std::vector&lt;B&gt; v;
	v.push_back(B(4));
	v.push_back(B(5));
	v.push_back(B(6));
	return v;
}

int main(int argc, char *argv[]){
	const std::vector&lt;B*&gt; vec1 = getVector();
	const std::vector&lt;A*&gt;&amp; vec2 = reinterpret_cast&lt;const std::vector&lt;A*&gt;&amp; &gt;(vec1);
	for(std::vector&lt;A*&gt;::const_iterator it = vec2.begin(); it!=vec2.end(); ++it){
		std::cout &lt;&lt; (*it)-&gt;i &lt;&lt; std::endl;
	}
	const std::vector&lt;B&gt; vec1b = getVectorB();
	const std::vector&lt;A&gt;&amp; vec2b = reinterpret_cast&lt;const std::vector&lt;A&gt;&amp; &gt;(vec1b);
	for(std::vector&lt;A&gt;::const_iterator it = vec2b.begin(); it!=vec2b.end(); ++it){
		std::cout &lt;&lt; (*it).i &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Funktioniert das reinterpret_cast in solchen Fällen immer? Mit welchen<br />
negativen Effekten muss ich rechnen? In diesem Fall funktioniert es mit<br />
meinem Compiler jedenfalls.</p>
<p>Vielen Dank für eure Hilfe,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207065/reinterpret_cast-auf-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 21:07:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207065.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Mar 2008 13:32:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to reinterpret_cast auf std::vector on Mon, 03 Mar 2008 13:32:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>im Zusammenhang mit einer pure virtual Function, die einen Vektor zurückliefert,<br />
bin ich auf folgendes Problem gestoßen. Ich möchte einen<br />
Vektor von Obst-Objekten zurückliefern, aber in einer Implementierung<br />
habe ich einen Vektor von Äpfeln. Ich hab mal die Argumentation von Stroustrup<br />
gelesen, dass man so etwas nicht casten kann, da ich sonst Bananen in den Apfel-<br />
korb legen kann. Diese Argumentation finde ich auch ziemlich einleuchtend.<br />
Wenn ich jetzt allerdings einen const std::vector&lt;Obst&gt;&amp; zurückliefer, besteht<br />
diese Gefahr ja nicht. Deswegen habe ich jetzt versucht, den std::vector<br />
mit einem reinterpret_cast zu casten. Ich habe das jetzt etwas losgelöst von<br />
meinem eigentlichen Problem versucht. Mir ist klar, dass in dem Code Speicher<br />
nicht freigegeben wird, vector-Kopien erzeugt werden, etc. und in diesem<br />
Fall durch ändern des Rückgabewertes auf Casten verzichtet werden kann.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

class A {
public:
	A(unsigned int i){
		this-&gt;i = i;
	}
	virtual ~A(){}
	unsigned int i;
};

class B : public A {
public:
	B(unsigned int i) : A(i) {
	}
	virtual ~B(){}
};

const std::vector&lt;B*&gt; getVector(){
	std::vector&lt;B*&gt; v;
	v.push_back(new B(1));
	v.push_back(new B(2));
	v.push_back(new B(3));
	return v;
}

const std::vector&lt;B&gt; getVectorB(){
	std::vector&lt;B&gt; v;
	v.push_back(B(4));
	v.push_back(B(5));
	v.push_back(B(6));
	return v;
}

int main(int argc, char *argv[]){
	const std::vector&lt;B*&gt; vec1 = getVector();
	const std::vector&lt;A*&gt;&amp; vec2 = reinterpret_cast&lt;const std::vector&lt;A*&gt;&amp; &gt;(vec1);
	for(std::vector&lt;A*&gt;::const_iterator it = vec2.begin(); it!=vec2.end(); ++it){
		std::cout &lt;&lt; (*it)-&gt;i &lt;&lt; std::endl;
	}
	const std::vector&lt;B&gt; vec1b = getVectorB();
	const std::vector&lt;A&gt;&amp; vec2b = reinterpret_cast&lt;const std::vector&lt;A&gt;&amp; &gt;(vec1b);
	for(std::vector&lt;A&gt;::const_iterator it = vec2b.begin(); it!=vec2b.end(); ++it){
		std::cout &lt;&lt; (*it).i &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Funktioniert das reinterpret_cast in solchen Fällen immer? Mit welchen<br />
negativen Effekten muss ich rechnen? In diesem Fall funktioniert es mit<br />
meinem Compiler jedenfalls.</p>
<p>Vielen Dank für eure Hilfe,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467288</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Mar 2008 13:32:51 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast auf std::vector on Mon, 03 Mar 2008 13:37:23 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Funktioniert das reinterpret_cast in solchen Fällen immer? Mit welchen negativen Effekten muss ich rechnen? In diesem Fall funktioniert es mit<br />
meinem Compiler jedenfalls.</p>
</blockquote>
<p>1. Nein<br />
2. Mit allem was durch fehlerhafte Daten etc. passieren kann<br />
3. Glück</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467294</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 03 Mar 2008 13:37:23 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast auf std::vector on Mon, 03 Mar 2008 13:49:42 GMT]]></title><description><![CDATA[<p>Danke für die schnelle prägnante Antwort, asc</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467308</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Mar 2008 13:49:42 GMT</pubDate></item></channel></rss>