<?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[Vector, Vererbte Klasse und der Copy Constructor]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachdem ich dachte ich hätte OOP verstanden kommt mir nun die STL in die Quere, denn während meine Polymorphie bei Einzelobjekten anstandlos funktioniert, funktioniert sie in einer &lt;vector&gt; Liste nicht mehr. Meine &quot;ShowName&quot; Funktion wird in der &lt;vector&gt; Liste nicht mehr von der &quot;Car&quot; Klasse benutzt, sondern von der &quot;Vehicle&quot; Klasse.</p>
<p>Folgendes Beispiel-Programm veranschaulicht mein Problem. Der Output des Programms ist unten angefügt. Ich vermute das ich Schwierigkeiten mit meinem Copy Konstruktor habe...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

class vehicle
{
public:
	virtual ~vehicle() { fprintf(stderr,&quot;Destroying the \&quot;vehicle::%s\&quot; !\n&quot;,cName); delete[] cName; cName=NULL; }
	vehicle(const class vehicle &amp;moep) { fprintf(stderr,&quot;Copy the \&quot;vehicle::%s\&quot;\n&quot;,moep.GetName()); this-&gt;SetName(moep.GetName()); }
	vehicle() { cName=NULL; fprintf(stderr,&quot;Create a \&quot;vehicle\&quot;\n&quot;); }

	bool SetName(const char *Name) { if (cName!=NULL) { delete[] cName; cName=NULL; } cName = new char[strlen(Name)+1]; strcpy(cName,Name); return true; }
	const char *GetName() const { return cName; }

	virtual void ShowName() const { fprintf(stderr,&quot;I am the vehicle \&quot;%s\&quot;\n&quot;,cName); }

private:

	char *cName;
};

class car:public vehicle
{
public:
	virtual ~car() { fprintf(stderr,&quot;Destroying the \&quot;car::%s\&quot; !\n&quot;,this-&gt;GetName()); }
	car(const class car &amp;moep):vehicle(moep) { fprintf(stderr,&quot;Copy the \&quot;car::%s\&quot;\n&quot;,moep.GetName()); this-&gt;SetName(moep.GetName()); this-&gt;setHorsePower(moep.getHorsePower()); }
	car() { uiPS=15; fprintf(stderr,&quot;Create a \&quot;car\&quot;\n&quot;); }

	void setHorsePower(const unsigned int PS) { uiPS = PS; }
	const unsigned int getHorsePower() const { return uiPS; }

	virtual void ShowName() const { fprintf(stderr,&quot;I am the car \&quot;%s\&quot; and i got \&quot;%d\&quot; horse power\n&quot;,this-&gt;GetName(),uiPS); }

protected:

	unsigned int uiPS;
};

int main () 
{
	// Checking vector list behavior
	class vehicle myVehicle;
	myVehicle.SetName(&quot;Transformer&quot;);
	myVehicle.ShowName();

	class car myCar;
	myCar.SetName(&quot;Kitt&quot;);
	myCar.ShowName();

	class vehicle *vec = NULL;
	vec = &amp;myVehicle;
	vec-&gt;ShowName();
	vec = &amp;myCar;
	vec-&gt;ShowName();

	vector&lt;class vehicle&gt; myVehiclePark;
	myVehiclePark.push_back(myVehicle);
	myVehiclePark.push_back(myCar);

	fprintf(stderr,&quot;There are %ld vehicle in my park :)\n&quot;,myVehiclePark.size());
	vector&lt;class vehicle&gt;::const_iterator iter;
	iter = myVehiclePark.begin(); 
    for( ; iter != myVehiclePark.end(); ++iter) 
    { 
        iter-&gt;ShowName(); 
    } 

	return 0;
}
</code></pre>
<p>Der Output ist</p>
<pre><code>// Instanzierung
Create a &quot;vehicle&quot;
I am the vehicle &quot;Transformer&quot;
Create a &quot;vehicle&quot;
Create a &quot;car&quot;
I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power

// Veranschaulichung der Polymorphie
I am the vehicle &quot;Transformer&quot;
I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power

// Aufruf der Copy Konstruktoren für die &lt;vector&gt; Liste, hier wird auch der falsche Ctor aufgerufen ?!
Copy the &quot;vehicle::Transformer&quot;
Copy the &quot;vehicle::Transformer&quot;
Copy the &quot;vehicle::Kitt&quot;

// Wieso wird hier schon ein Objekt zerstört ?
Destroying the &quot;vehicle::Transformer&quot; !

// Output der &lt;vector&gt; Liste
There are 2 vehicle in my park :)
I am the vehicle &quot;Transformer&quot;
I am the vehicle &quot;Kitt&quot; // &gt;&gt; hier sollte eher &quot;I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power&quot; erscheinen

// Vernichtung der selbstständigen Objekte und die in der &lt;vector&gt; Liste
Destroying the &quot;vehicle::Transformer&quot; !
Destroying the &quot;vehicle::Kitt&quot; !
Destroying the &quot;car::Kitt&quot; !
Destroying the &quot;vehicle::Kitt&quot; !
Destroying the &quot;vehicle::Transformer&quot; !
</code></pre>
<p>Was mache ich falsch ?</p>
<p>Winn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194557/vector-vererbte-klasse-und-der-copy-constructor</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 14:17:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194557.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Oct 2007 12:01:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector, Vererbte Klasse und der Copy Constructor on Mon, 08 Oct 2007 12:01:39 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachdem ich dachte ich hätte OOP verstanden kommt mir nun die STL in die Quere, denn während meine Polymorphie bei Einzelobjekten anstandlos funktioniert, funktioniert sie in einer &lt;vector&gt; Liste nicht mehr. Meine &quot;ShowName&quot; Funktion wird in der &lt;vector&gt; Liste nicht mehr von der &quot;Car&quot; Klasse benutzt, sondern von der &quot;Vehicle&quot; Klasse.</p>
<p>Folgendes Beispiel-Programm veranschaulicht mein Problem. Der Output des Programms ist unten angefügt. Ich vermute das ich Schwierigkeiten mit meinem Copy Konstruktor habe...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

class vehicle
{
public:
	virtual ~vehicle() { fprintf(stderr,&quot;Destroying the \&quot;vehicle::%s\&quot; !\n&quot;,cName); delete[] cName; cName=NULL; }
	vehicle(const class vehicle &amp;moep) { fprintf(stderr,&quot;Copy the \&quot;vehicle::%s\&quot;\n&quot;,moep.GetName()); this-&gt;SetName(moep.GetName()); }
	vehicle() { cName=NULL; fprintf(stderr,&quot;Create a \&quot;vehicle\&quot;\n&quot;); }

	bool SetName(const char *Name) { if (cName!=NULL) { delete[] cName; cName=NULL; } cName = new char[strlen(Name)+1]; strcpy(cName,Name); return true; }
	const char *GetName() const { return cName; }

	virtual void ShowName() const { fprintf(stderr,&quot;I am the vehicle \&quot;%s\&quot;\n&quot;,cName); }

private:

	char *cName;
};

class car:public vehicle
{
public:
	virtual ~car() { fprintf(stderr,&quot;Destroying the \&quot;car::%s\&quot; !\n&quot;,this-&gt;GetName()); }
	car(const class car &amp;moep):vehicle(moep) { fprintf(stderr,&quot;Copy the \&quot;car::%s\&quot;\n&quot;,moep.GetName()); this-&gt;SetName(moep.GetName()); this-&gt;setHorsePower(moep.getHorsePower()); }
	car() { uiPS=15; fprintf(stderr,&quot;Create a \&quot;car\&quot;\n&quot;); }

	void setHorsePower(const unsigned int PS) { uiPS = PS; }
	const unsigned int getHorsePower() const { return uiPS; }

	virtual void ShowName() const { fprintf(stderr,&quot;I am the car \&quot;%s\&quot; and i got \&quot;%d\&quot; horse power\n&quot;,this-&gt;GetName(),uiPS); }

protected:

	unsigned int uiPS;
};

int main () 
{
	// Checking vector list behavior
	class vehicle myVehicle;
	myVehicle.SetName(&quot;Transformer&quot;);
	myVehicle.ShowName();

	class car myCar;
	myCar.SetName(&quot;Kitt&quot;);
	myCar.ShowName();

	class vehicle *vec = NULL;
	vec = &amp;myVehicle;
	vec-&gt;ShowName();
	vec = &amp;myCar;
	vec-&gt;ShowName();

	vector&lt;class vehicle&gt; myVehiclePark;
	myVehiclePark.push_back(myVehicle);
	myVehiclePark.push_back(myCar);

	fprintf(stderr,&quot;There are %ld vehicle in my park :)\n&quot;,myVehiclePark.size());
	vector&lt;class vehicle&gt;::const_iterator iter;
	iter = myVehiclePark.begin(); 
    for( ; iter != myVehiclePark.end(); ++iter) 
    { 
        iter-&gt;ShowName(); 
    } 

	return 0;
}
</code></pre>
<p>Der Output ist</p>
<pre><code>// Instanzierung
Create a &quot;vehicle&quot;
I am the vehicle &quot;Transformer&quot;
Create a &quot;vehicle&quot;
Create a &quot;car&quot;
I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power

// Veranschaulichung der Polymorphie
I am the vehicle &quot;Transformer&quot;
I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power

// Aufruf der Copy Konstruktoren für die &lt;vector&gt; Liste, hier wird auch der falsche Ctor aufgerufen ?!
Copy the &quot;vehicle::Transformer&quot;
Copy the &quot;vehicle::Transformer&quot;
Copy the &quot;vehicle::Kitt&quot;

// Wieso wird hier schon ein Objekt zerstört ?
Destroying the &quot;vehicle::Transformer&quot; !

// Output der &lt;vector&gt; Liste
There are 2 vehicle in my park :)
I am the vehicle &quot;Transformer&quot;
I am the vehicle &quot;Kitt&quot; // &gt;&gt; hier sollte eher &quot;I am the car &quot;Kitt&quot; and i got &quot;15&quot; horse power&quot; erscheinen

// Vernichtung der selbstständigen Objekte und die in der &lt;vector&gt; Liste
Destroying the &quot;vehicle::Transformer&quot; !
Destroying the &quot;vehicle::Kitt&quot; !
Destroying the &quot;car::Kitt&quot; !
Destroying the &quot;vehicle::Kitt&quot; !
Destroying the &quot;vehicle::Transformer&quot; !
</code></pre>
<p>Was mache ich falsch ?</p>
<p>Winn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380426</guid><dc:creator><![CDATA[Winn]]></dc:creator><pubDate>Mon, 08 Oct 2007 12:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vector, Vererbte Klasse und der Copy Constructor on Mon, 08 Oct 2007 12:08:21 GMT]]></title><description><![CDATA[<p>Polymorphie funktioniert nur über Zeiger und Referenzen (letztere können aber nicht in einen vector&lt;&gt; gepackt werden). Du speicherst die Objekte direkt per Wert in deinen vector&lt;&gt; - und dabei wird der 'car'-Anteil des Objekts abgeschnitten (sog. &quot;Slicing&quot;).</p>
<p>(PS: Das Objekt, das beim/nach dem vector-Füllen zerlegt wird, ist das zweite 'Copy the &quot;vehicle::Transformer&quot;' - das hängt vermutlich damit zusammen, daß der vector&lt;&gt; seine Kapazität überschritten hat und alle Elemente umkopieren mußte)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380430</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 08 Oct 2007 12:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector, Vererbte Klasse und der Copy Constructor on Mon, 08 Oct 2007 12:27:52 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Polymorphie funktioniert nur über Zeiger und Referenzen (letztere können aber nicht in einen vector&lt;&gt; gepackt werden). Du speicherst die Objekte direkt per Wert in deinen vector&lt;&gt; - und dabei wird der 'car'-Anteil des Objekts abgeschnitten (sog. &quot;Slicing&quot;).</p>
<p>(PS: Das Objekt, das beim/nach dem vector-Füllen zerlegt wird, ist das zweite 'Copy the &quot;vehicle::Transformer&quot;' - das hängt vermutlich damit zusammen, daß der vector&lt;&gt; seine Kapazität überschritten hat und alle Elemente umkopieren mußte)</p>
</blockquote>
<p>Grmpfs, hätte ich mir denken können... die Abänderung der &quot;int main()&quot; in</p>
<pre><code class="language-cpp">int main () 
{
	// Checking vector list behavior
	class vehicle myVehicle;
	myVehicle.SetName(&quot;Transformer&quot;);
	myVehicle.ShowName();

	class car myCar;
	myCar.SetName(&quot;Kitt&quot;);
	myCar.ShowName();

	class vehicle *vec = NULL;
	vec = &amp;myVehicle;
	vec-&gt;ShowName();
	vec = &amp;myCar;
	vec-&gt;ShowName();

	vector&lt;class vehicle *&gt; myVehiclePark;
	myVehiclePark.push_back(&amp;myVehicle);
	myVehiclePark.push_back(&amp;myCar);

	fprintf(stderr,&quot;There are %ld vehicle in my park :)\n&quot;,myVehiclePark.size());
	vector&lt;class vehicle *&gt;::const_iterator iter;
	iter = myVehiclePark.begin(); 
    for( ; iter != myVehiclePark.end(); ++iter) 
    { 
		(*iter)-&gt;ShowName();
    } 

	return 0;
}
</code></pre>
<p>führt zum Erfolg. Allerdings bedeutet das doch auch, daß ich nun eine reine Pointer &lt;vector&gt; Liste besitze. Bei einer Annahme meine main() {} wäre nun eine Funktion foo() {} so würden doch alle Objekte nach der letzten Klammer } vernichtet werden und die Pointer zeigen ins Nirvana. Für mich bedeutet das, daß ich eine Klassehierachie in einer &lt;vector&gt; Liste nur als &quot;dynamische&quot; Objekte einbinden kann. Stimmt das ?</p>
<p>Danke schonmal !!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380441</guid><dc:creator><![CDATA[Winn]]></dc:creator><pubDate>Mon, 08 Oct 2007 12:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vector, Vererbte Klasse und der Copy Constructor on Mon, 08 Oct 2007 12:32:40 GMT]]></title><description><![CDATA[<p>Woher du die Elemente bekommst, ist dem vector egal - du mußt nur dafür sorgen, daß sie länger &quot;überleben&quot; als der vector, sonst bleiben nur Zeiger auf unbenutzten Speicher zurück.</p>
<p>(wenn du Probleme mit der dynamischen Speicherverwaltung siehst, nimm doch Smart-Pointer wie boost::shared_ptr<sup>*</sup> oder die Pointer-Container der Boost-Bibliothek)</p>
<p><sup>*</sup> vector&lt;auto_ptr&lt;vehicle&gt; &gt; geht nicht, weil ein auto_ptr nicht &quot;normal&quot; kopierbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380447</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 08 Oct 2007 12:32:40 GMT</pubDate></item></channel></rss>