<?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[Container für verschiedene Objekte]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der STL eigentlich einen Container in den man verschiedene Klassenobjekte &quot;reinwerfen&quot; kann?</p>
<p>Hintergrund ist, ich möchte einen Koffer simulieren in den man verschiedene Gegenstände reinlegen und wieder herausholen kann.<br />
Diese Gegenstände werden im Code von verschiedenen Klassen und deren Objektinstanzen repräsentiert.<br />
Ich habe mir bisher mit einem Vektor über eine Metaobjekt-Klasse beholfen, also Kapselung, das verschwendet aber unnötig Speicher.<br />
Beim Vektor kann man schön Elemente in der Mitte rauslöschen und die anderen rutschen alle nach, sowas bräuchte ich auch.</p>
<p>Ich hab mir schon Maps und verkettete Listen angeschaut, die haben mir aber auch nicht weitergeholfen.</p>
<p>Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146787/container-für-verschiedene-objekte</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 22:38:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146787.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 May 2006 19:59:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 19:59:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der STL eigentlich einen Container in den man verschiedene Klassenobjekte &quot;reinwerfen&quot; kann?</p>
<p>Hintergrund ist, ich möchte einen Koffer simulieren in den man verschiedene Gegenstände reinlegen und wieder herausholen kann.<br />
Diese Gegenstände werden im Code von verschiedenen Klassen und deren Objektinstanzen repräsentiert.<br />
Ich habe mir bisher mit einem Vektor über eine Metaobjekt-Klasse beholfen, also Kapselung, das verschwendet aber unnötig Speicher.<br />
Beim Vektor kann man schön Elemente in der Mitte rauslöschen und die anderen rutschen alle nach, sowas bräuchte ich auch.</p>
<p>Ich hab mir schon Maps und verkettete Listen angeschaut, die haben mir aber auch nicht weitergeholfen.</p>
<p>Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055160</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Wed, 10 May 2006 19:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:08:32 GMT]]></title><description><![CDATA[<p>Nein gibt es nicht. Als Alternative könntest du einen vector mit Zeiger auf void erstellen. Wenn es sich nur um Objekte eines bestimmten Typs handelt und alle eine Basisklasse haben, könntest du auch einen Zeiger der Basisklasse im vector verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055176</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 10 May 2006 20:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:10:35 GMT]]></title><description><![CDATA[<p>Ja, die sind alle abgeleitet. und du meinst ich könnte einen Vektor mit Zeigern auf die Basisklasse nehmen?<br />
Woher weiss ich aber dann um welche Klasse (die von der Basisklasse erbt) es sich handelt?</p>
<p>Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055177</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Wed, 10 May 2006 20:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:16:23 GMT]]></title><description><![CDATA[<p>du kannst dann dynamic_cast zum downcasten verwenden oder du baust ne virtuelle Methode a la &quot;Eclass getClassType()&quot; ein, die dann für jede klasse nen anderen Code zurückliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055184</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Wed, 10 May 2006 20:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:18:08 GMT]]></title><description><![CDATA[<p>Wenn du das wissen musst, gehören die Objekte nicht in ein Array.</p>
<p>Du brauchst eine abstrakte Basisklasse, die alle Funktionsdeklarationen bereitstellt, die du für deinen Koffer brauchst. Wenn du Funktionen aufrufen willst, die nur für manche Gegenstände Sinn haben, passt deine Logik nicht.</p>
<p>BTW: Den tatsächlichen Typ findest du mit typeof() raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055185</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 10 May 2006 20:18:08 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:21:20 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>BTW: Den tatsächlichen Typ findest du mit typeof() raus.</p>
</blockquote>
<p>Ne, typeof ist ne Erweiterung, die einige Compiler anbieten. Sie wertet zur Compilezeit den Typ eines Ausdrucks aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055188</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 10 May 2006 20:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Wed, 10 May 2006 20:27:11 GMT]]></title><description><![CDATA[<p>Dafür gibt es Vererbung, damit man eben genau das nicht wissen muss:</p>
<pre><code class="language-cpp">class Base {
  virtual string Name() =0;
};

class Derived1 : public Base {
  string Name() { return &quot;Derived1&quot;; }
};

class Derived2 : public Base {
  string Name() { return &quot;Derived2&quot;; }
};

int main()
{
  vector&lt;Base*&gt; v;
  v.push(new Derived1());
  v.push(new Derived2());
  for(int i=0; i&lt;v.size(); ++i)
    cout &lt;&lt; v[i]-&gt;Name() &lt;&lt; endl;
}
</code></pre>
<p>Du solltest dir dazu mal ein Buch über OOP durchlesen oder zumindest ein gutes Tutorial, wo das Prinzip der Vererbung und Polymorphie erklärt wird.</p>
<p>Wenn die Klassen wie, hier oben erwähnt, nicht alle Funktionen gemeinsam haben, musst du casten oder solltest deine Logik nochmal überdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055189</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 10 May 2006 20:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 04:04:53 GMT]]></title><description><![CDATA[<p>Vellas schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;Base*&gt; v;
  v.push(new Derived1());
  v.push(new Derived2());
  for(int i=0; i&lt;v.size(); ++i)
    cout &lt;&lt; v[i]-&gt;Name() &lt;&lt; endl;
}
</code></pre>
</blockquote>
<p>Oh, ich wusste nicht, dass ich in einen Vektor der Basisklasse auch die abgeleiteten Klassen reinpacken kann.<br />
Könnte ich dann prinzipiell eine (fast) leere Klasse machen von der dann alle anderen Klassen erben, nur um diese funktionalität dann zu haben?</p>
<p>Vielen Dank!<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055247</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Thu, 11 May 2006 04:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 04:33:30 GMT]]></title><description><![CDATA[<p>std::Robin schrieb:</p>
<blockquote>
<p>Könnte ich dann prinzipiell eine (fast) leere Klasse machen von der dann alle anderen Klassen erben, nur um diese funktionalität dann zu haben?</p>
</blockquote>
<p>Könntest du, ist aber, wie mehrere Vorredner bereits gesagt haben, vom Designstandpunkt her Blödsinn. Wenn du dann nämlich jedes Objekt erst nach seinem tatsächlichen Typ fragen musst, bevor du irgendetwas damit machst, hast du noch nicht verstanden, wozu man Vererbung einsetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055250</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 11 May 2006 04:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 08:15:35 GMT]]></title><description><![CDATA[<blockquote>
<p>Oh, ich wusste nicht, dass ich in einen Vektor der Basisklasse auch die abgeleiteten Klassen reinpacken kann.</p>
</blockquote>
<p>Neee kannst du eben nicht ... die container sind typegebunden.</p>
<p>du packst da keine Instanzen unterschiedlicher klassen rein, sondern zeiger auf diverse instanzen ....<br />
Wenn die abgeleitet sind, isses ok, geht aber auch ganz ohne (void * container) ^^ wenn man beim zurueckcasten weiss was man tut. ^^</p>
<p>Die schoenste form unterschiedliche Typen in nem container zu halten, ist ueber nen gemiensamen Adapter.<br />
Also ne classe vom Typ Gepaeckstuck, der du besipielsweisse nen anderen Typ ... Socke zum beispiel, occupieren(uebernehmen) kannst. Dein koffer hausst dann nur mit &quot;gepaeckstuecken&quot; voll ... Das ist aber ziemlich aufwendig und lohnt sich nur in wenigen faellen ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055337</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 11 May 2006 08:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 15:01:26 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class item
	{
	public:
	unsigned int		weight;
	unsigned int		width;
	unsigned int		length;
	unsigned int		height;
	virtual unsigned short gettype()=0;
    item(){}	
};
</code></pre>
<pre><code class="language-cpp">class weapon : public item
	{	public:
		unsigned short	aua;
		unsigned long   owner_id;
		std::string	name;
                unsigned short gettype();
                weapon();
};
</code></pre>
<pre><code class="language-cpp">class armor : public item
	{	public:

		unsigned long	schutz;
		unsigned long   owner_id;
		std::string	name;
		unsigned short gettype();
		armor();
};
</code></pre>
<p>Also ganz konkret. Ich möchte Waffen und Schutzkleidung in einen Koffer packen, der aber nur ein gewisses Limit an Gewicht und/oder Volumen aufnehmen kann.<br />
Dafür hab ich die Klassen oben erstellt. Jetzt hakt es am Koffer selber - da sollen nur Objekte vom Typ Armor und Weapon rein, später noch mehr...<br />
Bisher hatte ich zwei Ansätze versucht: Metaobjekte, also Kapselung und 2 Vektoren (für jede Klasse einen), was mir aber zu umständlich wird wenn ich da noch mehrere Sachen reinpacken möchte.</p>
<p>Ich dachte es wäre möglich ein enum von möglichen Objekten zu machen, und dann einen Vektor über das enum zu machen, klappt aber auch nicht. Das mit den Vektor über Zeigern klappt nicht, weil ich irgendwie nachher nicht mehr dereferenzieren kann.</p>
<p>Ich würde später deann auch gerne Methoden für den Koffer programmieren, wie z.B. entnehme_objekt_nummer(fortlaufende nummer), lege_waffe_in_den_koffer(&amp;armor) &lt;- push_back()....</p>
<p>Hat jemand eine Idee wie man so einen Koffer einfach und effizient verwirklichen kann?</p>
<p>Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055731</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Thu, 11 May 2006 15:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 16:15:33 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>ich denke, ich habe es hinbekommen:</p>
<pre><code class="language-cpp">vector&lt;item*&gt; v; 
	v.push_back(new weapon());
	v.push_back(new armor());
	cout&lt;&lt;v[0]-&gt;gettype();
	cout&lt;&lt;v[1]-&gt;gettype();

	if (v[0]-&gt;gettype() ==1)  //wenn 1 dann ists ne waffe
	{
		weapon *a;
		a=(weapon*) v[0];
		cout &lt;&lt;endl&lt;&lt;&quot;jjjjjjjjj:&quot;&lt;&lt;a-&gt;name&lt;&lt;endl;
	};
</code></pre>
<p>Das mag vielelicht alles andere als optimal sein, aber für mich als Anfänger langts allemal.</p>
<p>Vielen Dank an alle.</p>
<p>Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055797</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Thu, 11 May 2006 16:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 17:51:48 GMT]]></title><description><![CDATA[<p>Und das Freigeben des Speichers durch delete solltest nicht vergessen:</p>
<pre><code class="language-cpp">vector&lt;Base*&gt; v;
// wird hier mit irgendwas befüllt

// speicher freigeben und zeiger löschen:
while(v.size()) {
		delete v.back();
		v.pop_back();
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1055881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055881</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 11 May 2006 17:51:48 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 18:36:14 GMT]]></title><description><![CDATA[<p>Ein einzelnes Element aus der Mitte löschen geht also mit</p>
<pre><code class="language-cpp">delete v.begin() + pos;
v.erase (v.begin() + pos);
</code></pre>
<p>richtig?<br />
Gruss<br />
R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055929</guid><dc:creator><![CDATA[std**Robin]]></dc:creator><pubDate>Thu, 11 May 2006 18:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 18:46:45 GMT]]></title><description><![CDATA[<p>wenn du oft elemente aus der mitte löschen willst, dann nimm lieber std::list.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055942</guid><dc:creator><![CDATA[ACHTUNG!!!]]></dc:creator><pubDate>Thu, 11 May 2006 18:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Thu, 11 May 2006 19:08:31 GMT]]></title><description><![CDATA[<p>Schau dier aus der Boost Bibliothek die any-Klasse an.</p>
<p>Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055975</guid><dc:creator><![CDATA[Tommi]]></dc:creator><pubDate>Thu, 11 May 2006 19:08:31 GMT</pubDate></item><item><title><![CDATA[Reply to Container für verschiedene Objekte on Fri, 12 May 2006 06:08:24 GMT]]></title><description><![CDATA[<p>Btw, da offenbar alle deine Items einen Namen haben, solltest du die &quot;string name;&quot; auch mit in die Basisklasse auslagern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056089</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 12 May 2006 06:08:24 GMT</pubDate></item></channel></rss>