<?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[Wie mit generischen Zeigern umgehen?]]></title><description><![CDATA[<p>Ich möchte verschiedene Klassen in einer Liste unterbringen, damit ich sie in einer Schleife abarbeiten kann. Da kommen also wohl typenlose Zeiger in Frage. Schon bei den ersten Versuchen damit bleibe ich stecken. Trotz des Castings gelingt nicht der Zugriff über den typenlosen Zeiger:</p>
<pre><code>class Class1 {
public:
	int val;
	void SetVal (int v) {val = v;}
	void ShowVal () {printf (&quot;\n Wert: %i \n&quot;, val);}
};

int main() {
	Class1 Simple;
	Simple.SetVal (123);
	Simple.ShowVal (); // ok, zeigt 123 an

	// nun mit typisiertem Zeiger
	Class1 *PSimple = &amp;Simple;
	PSimple-&gt;ShowVal (); // auch ok

	// schließlich mit generischem Zeiger
	void *GenSimple;
	GenSimple = (Class1*) &amp;Simple;
	GenSimple-&gt;ShowVal ();  // error: void is not a pointer-to-object type
}
</code></pre>
<p>Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235691/wie-mit-generischen-zeigern-umgehen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:40:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235691.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2009 10:52:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Thu, 05 Mar 2009 10:52:06 GMT]]></title><description><![CDATA[<p>Ich möchte verschiedene Klassen in einer Liste unterbringen, damit ich sie in einer Schleife abarbeiten kann. Da kommen also wohl typenlose Zeiger in Frage. Schon bei den ersten Versuchen damit bleibe ich stecken. Trotz des Castings gelingt nicht der Zugriff über den typenlosen Zeiger:</p>
<pre><code>class Class1 {
public:
	int val;
	void SetVal (int v) {val = v;}
	void ShowVal () {printf (&quot;\n Wert: %i \n&quot;, val);}
};

int main() {
	Class1 Simple;
	Simple.SetVal (123);
	Simple.ShowVal (); // ok, zeigt 123 an

	// nun mit typisiertem Zeiger
	Class1 *PSimple = &amp;Simple;
	PSimple-&gt;ShowVal (); // auch ok

	// schließlich mit generischem Zeiger
	void *GenSimple;
	GenSimple = (Class1*) &amp;Simple;
	GenSimple-&gt;ShowVal ();  // error: void is not a pointer-to-object type
}
</code></pre>
<p>Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674542</guid><dc:creator><![CDATA[erin]]></dc:creator><pubDate>Thu, 05 Mar 2009 10:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Thu, 05 Mar 2009 10:54:13 GMT]]></title><description><![CDATA[<p>das wird so nicht sinnvill.<br />
es wird erst ok, wenn es auch einen grund gibt, die pbjekte in eine gemeinsame liste zu stopfen und in der schleife den gleichen funktionsaufruf zu machen. und dann haste sinnigerweise ne gemeinsame basisklasse, in der jene funktion virtual deklariert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674544</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 05 Mar 2009 10:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Thu, 05 Mar 2009 11:36:04 GMT]]></title><description><![CDATA[<p>Was volkard damit sagen will ist, dass deine Klassen von einer gemeinsamen Basisklases erben sollen. Diese &quot;kennt&quot; dann alle Funktionen, die du in deiner Liste aufrufen willst. siehe auch Vererbung und Polymorphie.</p>
<pre><code class="language-cpp">class basisKlasse {
    virtual void ShowVal() = 0; // Funktion deklarieren, alle Kindklassen müssen diese implementieren
}

class Class1 : public basisKlasse{
public:
    int val;
    void SetVal (int v) {val = v;}
    virtual void ShowVal () {printf (&quot;\n Wert: %i \n&quot;, val);}
};

int main() {
    Class1 Simple;
    Simple.SetVal (123);

    // mit basisklasse die die Funktion ShowVal() kennt
    basisKlasse *GenSimple;
    GenSimple = &amp;Simple;    // kein Cast notwendig
    GenSimple-&gt;ShowVal ();  // basisKlasse kennt ShowVal(), Class1::ShowVal wird gerufen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1674566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674566</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Thu, 05 Mar 2009 11:36:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Thu, 05 Mar 2009 12:21:17 GMT]]></title><description><![CDATA[<p>Um das Problem mal zu beantworten:<br />
Du kannst void-Zeiger nicht dereferenzieren, weil die Größe des Datenobjekts, auf das gezeigt wird, unbekannt ist. Deswegen bräuchtest du zuerst einen Cast. Also sowas:</p>
<blockquote>
<p>((Class1 *)GenSimple)-&gt;ShowVal ();</p>
</blockquote>
<p>Aber das ist natürlich hässlich und wenn ich mir deinen Code so betrachte, sieht es schwer nach einer Mischung aus C und C++ aus (-&gt; printf, void-Zeiger-Gecaste). Nimm dir die Tipps meiner Vorredner zu Herzen. <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="😉"
    /> (Aber auch hier bitte nicht printf verwenden. Das ist einfach C.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674596</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Thu, 05 Mar 2009 12:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Fri, 06 Mar 2009 19:00:01 GMT]]></title><description><![CDATA[<p>Ja, die Richtung habe ich nun erkannt. Es geht wirklich darum, verschiedene Objekte in eine Liste zu packen, die zur Laufzeit aufgebaut wird und mit gemeinsamen Funktionsaufrufen angesprochen werden soll.</p>
<p>Und was C angeht: In der Tat, ich bin dabei, mein C-Geschreibsel nach C++ umzubauen, und so einige Gewohnheiten brechen noch durch.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675479</guid><dc:creator><![CDATA[erin]]></dc:creator><pubDate>Fri, 06 Mar 2009 19:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie mit generischen Zeigern umgehen? on Fri, 06 Mar 2009 19:54:25 GMT]]></title><description><![CDATA[<p>moagnus schrieb:</p>
<blockquote>
<p>Du kannst void-Zeiger nicht dereferenzieren, weil die Größe des Datenobjekts, auf das gezeigt wird, unbekannt ist.</p>
</blockquote>
<p>Nicht nur die Grösse, sondern die gesamte interne Darstellung des Datentyps.</p>
<p>erin schrieb:</p>
<blockquote>
<p>Und was C angeht: In der Tat, ich bin dabei, mein C-Geschreibsel nach C++ umzubauen, und so einige Gewohnheiten brechen noch durch.</p>
</blockquote>
<p>Ich würde dir raten, unbedingt ein C++-Buch anzuschaffen. Die prozeduralen Dinge wie Schleifen und Funktionen mögen in C und C++ noch einigermassen gleich sein, aber wenn es um Objektorientierung, Templates und die Standardbibliothek geht, bist du mit Neulernen besser beraten als mit Umlernen. Die Konzepte unterscheiden sich um Dimensionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675499</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 06 Mar 2009 19:54:25 GMT</pubDate></item></channel></rss>