<?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[Zeigerzuweisung mit unterschiedlichen Zeigertypen]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Codesegment:</p>
<pre><code class="language-cpp">switch (m_ProcessorType)
    {
    case COP8CBE9:
        cCOP8CBE9* Flash = new cCOP8CBE9(this);
        break;
    }

    Error = Flash-&gt;ReadFlash(_AddressHighByte, _AddressLowByte);
    delete Flash;
</code></pre>
<p>Hier beschwert sich der Compiler, dass Flash nicht deklariert sei. Klar, der<br />
Pointer liegt im Switch-Block, und ist somit ausserhalb nicht gültig.<br />
Meine Idee war, Flash zu einer Membervariablen der Klasse zu machen.<br />
Allerdings kann Flash in der weiteren Entwicklung des Programms von<br />
verschiedenen Typen sein, also nicht nur cCOP8CBE9*.<br />
Ich könnte die Zugriffe in die Switch-Anweisung mit aufnehmen, dann müsste ich<br />
aber diese Zeilen in jedem case wiederholen.<br />
Gibt es eine andere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227959/zeigerzuweisung-mit-unterschiedlichen-zeigertypen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 18:03:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227959.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Nov 2008 23:45:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Fri, 21 Nov 2008 23:45:39 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Codesegment:</p>
<pre><code class="language-cpp">switch (m_ProcessorType)
    {
    case COP8CBE9:
        cCOP8CBE9* Flash = new cCOP8CBE9(this);
        break;
    }

    Error = Flash-&gt;ReadFlash(_AddressHighByte, _AddressLowByte);
    delete Flash;
</code></pre>
<p>Hier beschwert sich der Compiler, dass Flash nicht deklariert sei. Klar, der<br />
Pointer liegt im Switch-Block, und ist somit ausserhalb nicht gültig.<br />
Meine Idee war, Flash zu einer Membervariablen der Klasse zu machen.<br />
Allerdings kann Flash in der weiteren Entwicklung des Programms von<br />
verschiedenen Typen sein, also nicht nur cCOP8CBE9*.<br />
Ich könnte die Zugriffe in die Switch-Anweisung mit aufnehmen, dann müsste ich<br />
aber diese Zeilen in jedem case wiederholen.<br />
Gibt es eine andere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618626</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 21 Nov 2008 23:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 00:03:43 GMT]]></title><description><![CDATA[<p>C++ hat den Weg der Typsicherheit eingeschlagen. Das heisst, eine Variable kann nicht mehrere Typen haben, sondern nur den, mit dem sie deklariert wurde.</p>
<p>Falls <code>COP8CBE9</code> eine Klasse ist, könntest du diesen und die anderen Typen beispielsweise mit einer Basisklasse kompatibel machen, indem du Laufzeitpolymorphie nutzt. Durch virtuelle Funktionen wäre dafür gesorgt, dass je nach Typ, auf den der Zeiger zeigt, die entsprechende Methode aufgerufen wird.</p>
<p>Ansonsten gäbe es nur noch die hässliche Möglichkeit des <code>void</code> -Zeigers. <code>void*</code> ist aber eher C und auch nicht typsicher, zudem muss er jedes Mal explizit dereferenziert werden, viel ist damit also nicht gewonnen. Vielmehr handelt man sich so hässliche Fallunterscheidungen, Frickelcode und Fehleranfälligkeit ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618631</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 22 Nov 2008 00:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 00:19:22 GMT]]></title><description><![CDATA[<p>Das Problem mit der Basisklasse ist, dass es sich um eine Klasse handelt, die<br />
verschiedene Prozessortypen programmieren kann. Und je nach Typ unterscheiden<br />
sich diese Funktionen. Die meisten hätte ich in der Basisklasse nicht zur<br />
Verfügung.<br />
Vielleicht fahr ich mit dem Kopieren der beiden Zeilen am besten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618633</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 22 Nov 2008 00:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 00:22:35 GMT]]></title><description><![CDATA[<p>Das versteh ich jetzt nicht ganz...</p>
<p>Kannst du denn nicht die Basisklasse so einrichten, dass sie und die abgeleiteten Klassen eine ähnliche Schnittstelle besitzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618635</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 22 Nov 2008 00:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 01:06:23 GMT]]></title><description><![CDATA[<p>Naja, die Schnittstelle dürfte für alle Prozessoren gleich sein.<br />
Ich hab als Argumente ein Highbyte und ein Lowbyte für die Adresse,<br />
und einen vector&lt;unsigned&gt; für die Datenbytes. Momentan hab ich halt<br />
nur den COP8 implementiert, weil dieser in dem Gerät verbaut ist, das<br />
ich programmieren will. Der COP8 z. B. beschreibt nicht nur einzelne<br />
Bytes, sondern ganze Pages. Also dürfte sich nur der Funktionsrumpf<br />
ändern, ausser wenn mit mehr als 2 Bytes adressiert werden muss.<br />
Ich hab nicht so viel Erfahrung mit Polymorphie. Aber ich könnte doch<br />
auch eine abstrakte Basisklasse entwerfen, wo ich die READ-, Write-, und<br />
Erase-Funktion überschreiben muss. Zusätzliche Funktionen werden nicht<br />
hinzukommen. Kann ich denn überhaupt einen Objektzeiger der abgeleiteten<br />
Klasse übergeben, obwohl ein Objektzeiger auf die Basisklasse erwartet<br />
wird? In der abgeleiteten Klasse werden nicht mehr Funktionen vorhanden<br />
sein, wie in der Basisklasse. Sie werden die gleiche Signatur haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618641</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 22 Nov 2008 01:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 12:27:18 GMT]]></title><description><![CDATA[<p>mase schrieb:</p>
<blockquote>
<p>Kann ich denn überhaupt einen Objektzeiger der abgeleiteten<br />
Klasse übergeben, obwohl ein Objektzeiger auf die Basisklasse erwartet<br />
wird?</p>
</blockquote>
<p>Ja, das ist eben der Vorzug der Polymorphie. Wenn virtuelle Funktionen in Basis- und abgeleiteter Klasse vorhanden sind, wird je nach Objekttyp, auf den der Zeiger zeigt, automatisch die richtige Funktion ausgewählt - auch wenn der Zeiger vom Typ &quot;Zeiger auf Basisklasse&quot; ist.</p>
<p>mase schrieb:</p>
<blockquote>
<p>In der abgeleiteten Klasse werden nicht mehr Funktionen vorhanden<br />
sein, wie in der Basisklasse. Sie werden die gleiche Signatur haben.</p>
</blockquote>
<p>Dann würde ich es erst recht mit Polymorphie machen.</p>
<p>Zur Verdeutlichung:</p>
<pre><code class="language-cpp">class Base
{
	public:
		virtual void Func() {std::cout &lt;&lt; &quot;Base.&quot; &lt;&lt; std::endl;}
};

class Derived : public Base
{
	public:
		virtual void Func() {std::cout &lt;&lt; &quot;Derived.&quot; &lt;&lt; std::endl;}
};

void Output(Base* ptr)	// es wird ein Basisklassenzeiger erwartet, es können aber auch
{						 // Zeiger auf abgeleitete Klassen übergeben werden.
	ptr-&gt;Func();	// ruft je nach Objekt (*ptr) die richtige Funktion auf.
}

int main()
{
	Base b;
	Derived d;
	Base* pd = new Derived;

	Output(&amp;b);	// Base* zeigt auf Base.		   Ausgabe: Base.
	Output(&amp;d);	// Derived* zeigt auf Derived.	 Ausgabe: Derived.
	Output(pd);	// Base* zeigt auf Derived.		Ausgabe: Derived.

    delete pd;
}
</code></pre>
<p>Was hier mit Zeigern geht, kann übrigens auch mit Referenzen gemacht werden.</p>
<p>P.S. Das Forum besitzt eine automatische Zeilenumbruchsfunktion, so wäre dein Text ein bisschen flüssiger zu lesen... <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618775</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 22 Nov 2008 12:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerzuweisung mit unterschiedlichen Zeigertypen on Sat, 22 Nov 2008 20:34:51 GMT]]></title><description><![CDATA[<p>Danke, hat funktioniert!<br />
Ich habe eine abstrakte Basisklasse entworfen. Da hat sogar nur eine<br />
Headerdatei gereicht. Von der kann ich dann meine einzelnen Prozessorklassen<br />
ableiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619054</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 22 Nov 2008 20:34:51 GMT</pubDate></item></channel></rss>