<?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[Liste mit void*]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich habe eine Anzahl an Klassen welche ich in einer gemeinsamen Liste ablegen möchte(muss).</p>
<p>Ich habe jetzt die Möglichkeit dies entweder über Liste zu tun die einen struct enthält der so deklariert ist:</p>
<pre><code class="language-cpp">struct MyBspStruct
{
     void* MyObject;
     MyObjectType MyType; // enum für den Type
};
</code></pre>
<p>Dies ist nötig damit ich auch entsprechende wieder zurückcasten kann.</p>
<p>Wirkliche Gemeinsamkeiten der Objecte gibt es nicht. So das wenn ich eine Basisklasse schaffen würde, diese eigentlich so gut wie keine virtuell überschriebene Funktionen enthalten würde. Das bedeutet das ich mir auch den Type merken müsste. Um zurück zu casten.</p>
<p>Gibt es evtl. noch eine weiter Lösung...??<br />
Bzw. was ist die sinnvollere und im Programm schnellere Variante und warum??<br />
Wie verhält sich das ganze wenn MyObject im Orginal kein Zeiger ist sondern eine Variable. Ist der cast zu 'void*' und von 'void*' auch dann noch sicher??</p>
<p>Mfg<br />
Ollow</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307774/liste-mit-void</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 16:00:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307774.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Sep 2012 08:43:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 09:24:45 GMT]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich habe eine Anzahl an Klassen welche ich in einer gemeinsamen Liste ablegen möchte(muss).</p>
<p>Ich habe jetzt die Möglichkeit dies entweder über Liste zu tun die einen struct enthält der so deklariert ist:</p>
<pre><code class="language-cpp">struct MyBspStruct
{
     void* MyObject;
     MyObjectType MyType; // enum für den Type
};
</code></pre>
<p>Dies ist nötig damit ich auch entsprechende wieder zurückcasten kann.</p>
<p>Wirkliche Gemeinsamkeiten der Objecte gibt es nicht. So das wenn ich eine Basisklasse schaffen würde, diese eigentlich so gut wie keine virtuell überschriebene Funktionen enthalten würde. Das bedeutet das ich mir auch den Type merken müsste. Um zurück zu casten.</p>
<p>Gibt es evtl. noch eine weiter Lösung...??<br />
Bzw. was ist die sinnvollere und im Programm schnellere Variante und warum??<br />
Wie verhält sich das ganze wenn MyObject im Orginal kein Zeiger ist sondern eine Variable. Ist der cast zu 'void*' und von 'void*' auch dann noch sicher??</p>
<p>Mfg<br />
Ollow</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248584</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Wed, 05 Sep 2012 09:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 08:48:54 GMT]]></title><description><![CDATA[<p>Dass die Objekte zusammen in einer Liste liegen sollen, ist ja schonmal eine gemeinsamkeit. <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 />
Wieso müsstest du dir bei einer gemeinsamen Basisklasse auch den Typ merken? Verpass dieser nen virtuellen dtor und wohin du casten willst, siehst du an der rtti.<br />
Da es später eh bestimmt (vermutlich sogar berechtigtes) Designgemecker geben wird: Was hast du überhaupt vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248587</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Wed, 05 Sep 2012 08:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 08:52:38 GMT]]></title><description><![CDATA[<p>Wie hier schon erwähnt: <a href="http://www.c-plusplus.net/forum/307770" rel="nofollow">http://www.c-plusplus.net/forum/307770</a></p>
<p>Boost.Any und Boost.Variant...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248592</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 05 Sep 2012 08:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 09:09:06 GMT]]></title><description><![CDATA[<p>Ja das ist aber auch schon so ziemlich die einzige Gemeinsamkeit. Stimmt anhand der RTTI kann ich ja ermitteln welche Klasse es ist. Das heißt ich kann mir eine Variable bereits sparen.</p>
<p>Wie bereits erwähnt ist es das Ziel die Objecte unabhängig vom Typen in einer Liste zusammenzuführen, welche anschließend nacheinander abgearbeitet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248598</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Wed, 05 Sep 2012 09:09:06 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 09:20:48 GMT]]></title><description><![CDATA[<p>Wo ist der Sinn, den Kram in einer gemeinsamen Liste zu speichern, wenn die Typen nichts mit einander zu tun haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248607</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Sep 2012 09:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 12:27:46 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct MyBspStruct
{
     void* MyObject;
     MyObjectType MyType; // enum für den Type
};
</code></pre>
<p>Dies ist nötig damit ich auch entsprechende wieder zurückcasten kann.</p>
</blockquote>
<p>Glaube ich dir nicht so ganz. Das geht möglicherweise auch besser vom Design her.</p>
<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Wirkliche Gemeinsamkeiten der Objecte gibt es nicht. So das wenn ich eine Basisklasse schaffen würde, diese eigentlich so gut wie keine virtuell überschriebene Funktionen enthalten würde. Das bedeutet das ich mir auch den Type merken müsste. Um zurück zu casten.</p>
</blockquote>
<p>Nur mal so am Rande: Wem &quot;gehören&quot; denn die Objekte? Also, in welchem Speicher stehen sie? Falls im Freispeicher: Wer gibt sie wieder frei?</p>
<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Gibt es evtl. noch eine weiter Lösung...??</p>
</blockquote>
<p>Bestimmt.</p>
<p>Da du dir den Typ eh merken willst, kannst du dir im Notfall auch einen <a href="http://ideone.com/TqnYH" rel="nofollow">&quot;anyptr&quot;</a> bauen, der sich das für dich schon richtig merkt. So könntest wenigstens Typfehler reduzieren.</p>
<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Bzw. was ist die sinnvollere und im Programm schnellere Variante und warum??<br />
Wie verhält sich das ganze wenn MyObject im Orginal kein Zeiger ist sondern eine Variable. Ist der cast zu 'void*' und von 'void*' auch dann noch sicher??</p>
</blockquote>
<p>Zu wenig Information du verraten hast. Vielleicht ist boost::any doch das, was du willst, wenn du es nicht mal auf Zeiger beschränken kannst.</p>
<p>Cheers!<br />
k.k.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248689</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 05 Sep 2012 12:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 13:09:15 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Wie bereits erwähnt ist es das Ziel die Objecte unabhängig vom Typen in einer Liste zusammenzuführen, welche anschließend nacheinander abgearbeitet werden.</p>
</blockquote>
<p>Sry, aber das klingt stark nach kaputtem Design. Wie genau hast du vor, Objekte, die absolut nichts miteinander zu tun haben, an einer gemeinsamen Stelle &quot;abzuarbeiten&quot; und vor allem wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248709</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 05 Sep 2012 13:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:19:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreib mal kurz für Ollow_AM, wir sind im gleichen Team.</p>
<p>Stellt euch das folgt vor.<br />
Ich habe eine Liste an Reifen, die ich bewegen kann. Z.B. Reifen-&gt;Drehen();</p>
<p>In der gleichen Liste habe ich z.B. auch Autos, die 4 Reifen beinhalten, aber diese nicht erben können. Auto-&gt;Alle4ReifenDrehen();</p>
<p>In der gleichen Liste habe ich aber auch Motorräder mit 2 Reifen, die sich ebenfalls vorwärts bewegen können. Motorrad-&gt;Alle2ReifenDrehen();</p>
<p>Also schaut meine Liste ähnlich dem aus:</p>
<pre><code class="language-cpp">namespace Afgrammt
{
  enum WasReifenHat
  {
    IsReifen = 0,
    IsAuto,
    IsMotorrad
  };

  struct InListe
  {
    void* MitReifen;
    Afgrammt::WasReifenHat WasIstEs;
  };
};

typedef std::list&lt;InListe&gt; Reifenliste;
</code></pre>
<p>Nun kann ich alles was Reifen hat in die Liste legen und je nachdem was es für ein Typ ist, kann den Ursprungstype zurück casten und dann die jeweilige Funktion zum Reifen drehen aufrufen.</p>
<p>Natürlich wird jetzt jeder sagen =&gt; schlechtes Design, warum nicht eine abstracte Class reinerben, die eine Funktion &quot;virtual void DreheAlleReifen() = 0;&quot; hat und mit Zeiger darauf arbeiten.<br />
Die Antwort ist einfach: Weil die Klassen, die wir hier ablegen leider Gottes aus DLLs kommen, die von mehreren anderen Programmierern geschrieben werden und wir keine Möglichkeit haben auf die h-Dateien und Vererbungen Einfluss zu nehmen.</p>
<p>Daher dieser Ansatz.<br />
Also kurzum: Jede Klasse hat eine andere Funktion, die ich Anhand des Klassen-Typ aufrufen muss und ich habe keine Möglichkeit am Design der enthaltenen Klassen etwas zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248733</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:19:51 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:27:27 GMT]]></title><description><![CDATA[<p>Und warum könnt ihr nicht einfach eine Liste für alle Reifen, eine Liste für alle Autos und eine Liste für alle Motorräder haben?</p>
<p>One list to rule them all, one list to find them, one list to bring them all and in darkness bind them...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248734</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:29:59 GMT]]></title><description><![CDATA[<p>Macht doch einfach Adapter um die fremden Klassen drumherum. Dann müsst ihr euch mit den verschiedenen Interfaces nicht an jeder Stelle in eurem Code erneut rumschlagen, sondern habt das einmal schön gebündelt und könnt innerhalb eurer Anwendung sauber programmieren. <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/2248736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248736</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:28:30 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Und warum könnt ihr nicht einfach eine Liste für alle Reifen, eine Liste für alle Autos und eine Liste für alle Motorräder haben?</p>
<p>One list to rule them all, one list to find them, one list to bring them all and in the darkness bind them...</p>
</blockquote>
<p>Weil die Liste von verschieden Stellen aus gefüllt wird und wir die Liste von oben nach unten (per Events und immer nur 1 Eintrag pro Eventloop) abarbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248737</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:31:56 GMT]]></title><description><![CDATA[<p>Dann steckt die drei Listen in eine Klasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248739</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:31:56 GMT]]></title><description><![CDATA[<p>Dobi schrieb:</p>
<blockquote>
<p>Macht doch einfach Adapter um die fremden Klassen drumherum. Dann müsst ihr euch mit den verschiedenen Interfaces nicht an jeder Stelle in eurem Code erneut rumschlagen, sondern habt das einmal schön gebündelt und könnt innerhalb eurer Anwendung sauber programmieren. <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>Ist mein struct nicht eigentlich bereits &quot;der&quot; Adapter?<br />
Also wenn ich den struct in class umschreibe und die Aufrufe innerhalb abwickle?<br />
So gemeint?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248738</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:34:22 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Dann steckt die drei Listen in eine Klasse?</p>
</blockquote>
<p>Aber ich bräuchte noch eine Liste, die mir sagt, wer dran ist...</p>
<pre><code>struct WerIstDran
{
  template&lt;class ListTyp&gt; std::list&lt;ListTyp&gt; WelcheListe;
  size_t Position;
};
std::list&lt;WerIstDran&gt; MeineReifenZudrehen;
</code></pre>
<p>Ist glaube ich auch nicht dienlich?!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248740</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:40:03 GMT]]></title><description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/State_pattern" rel="nofollow">http://en.wikipedia.org/wiki/State_pattern</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248742</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:43:02 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>Dobi schrieb:</p>
<blockquote>
<p>Macht doch einfach Adapter um die fremden Klassen drumherum. Dann müsst ihr euch mit den verschiedenen Interfaces nicht an jeder Stelle in eurem Code erneut rumschlagen, sondern habt das einmal schön gebündelt und könnt innerhalb eurer Anwendung sauber programmieren. <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>Ist mein struct nicht eigentlich bereits &quot;der&quot; Adapter?<br />
Also wenn ich den struct in class umschreibe und die Aufrufe innerhalb abwickle?<br />
So gemeint?</p>
</blockquote>
<p>Ne, ich meinte eher sowas:</p>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;algorithm&gt;

class FremdesAuto
{
public:
	void Alle4ReifenDrehen() { std::cout &lt;&lt; &quot;Auto&quot; &lt;&lt; std::endl; }
};

class FremdesMotorrad
{
public:
	void Alle2ReifenDrehen() { std::cout &lt;&lt; &quot;Motorrad&quot; &lt;&lt; std::endl; }
};

class Fahrzeug
{
public:
	virtual ~Fahrzeug() {}
	virtual void DreheAlleReifen() = 0;
};

class MeinAuto : public Fahrzeug
{
	virtual void DreheAlleReifen() override { fremdesAuto_.Alle4ReifenDrehen(); };
private:
	FremdesAuto fremdesAuto_;
};

class MeinMotorrad : public Fahrzeug
{
	virtual void DreheAlleReifen() override { fremdesMotorrad_.Alle2ReifenDrehen(); };
private:
	FremdesMotorrad fremdesMotorrad_;
};

int main()
{
	typedef std::shared_ptr&lt;Fahrzeug&gt; FahrzeugPtr;
	std::list&lt;FahrzeugPtr&gt; fahrzeuge;
	fahrzeuge.push_back(std::make_shared&lt;MeinAuto&gt;());
	fahrzeuge.push_back(std::make_shared&lt;MeinMotorrad&gt;());
	std::for_each(std::begin(fahrzeuge), std::end(fahrzeuge), [](FahrzeugPtr ptr)
	{
		ptr-&gt;DreheAlleReifen();
	});
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2248744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248744</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:43:02 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit void* on Wed, 05 Sep 2012 14:48:57 GMT]]></title><description><![CDATA[<p>@all: Danke.</p>
<p>Ich glaube der Ansatz von Dobi bringt und am weitesten.<br />
Aber ich werde mich noch weiter mit dem Thema auseinandersetzen (müssen).</p>
<p>Ich sehe die Frage als Beantwortet an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248745</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Wed, 05 Sep 2012 14:48:57 GMT</pubDate></item></channel></rss>