<?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[Mehrfachvererbung Ptr Vergleich]]></title><description><![CDATA[<p>Hallo,</p>
<p>entgegen aller Warnungen hab ich in einem aktuellen Projekt ziemlich viel mehrfach vererbt. Das ganze ist der Tatsache geschuldet, das Design und Implementierung komplett getrennt sein sollten (Header komplett Plattformunabhängig, Implementierung DAO und Windows) und die einzelnen Abstraktionebenen unabhängig voneinander in verschiedenen Projekten genutzt werden. Wenn ich zu Projektbeginn schon ein bisschen mehr Erfahrung mit Templates gehabt hätte, wäre die Lösung sicher eleganter geworden - egal:</p>
<pre><code class="language-cpp">template&lt;class TDbReadWrapper&gt;
class DbObserver : public IDbReadObserver
{
	DbOpener* GetOpener(void){return m_pDbWrapper;}
        bool EqualsPtr( const void* pPtr )const//tests for equality to the given Ptr
		{ 
			return ( (pPtr &gt;= m_pDbWrapper) &amp;&amp; (pPtr &lt; ( m_pDbWrapper + sizeof(TDbReadWrapper) ) ) );//liegt der Ptr im Speicherbereich des m_pDbWrapper???
		}
        TDbReadWrapper* m_pDbWrapper;
}
</code></pre>
<p>Ich muß zu bestimmten Gegebenheiten checken, ob ein bestimmter DbOpener dem gewrapptem m_pDbWrapper entspricht. Einen vernünftigen op== kann ich dafür nicht schreiben. Also vergleiche ich die Ptr. Der von GetOpener zurückgelieferte Ptr zeigt aber schon auf einen anderen Speicherbereich als der zugehörige m_pDbWrapper. Also vergleiche ich in EqualsPtr, ob der gegebene Ptr in dem Bereich liegt, den die Instanz, auf die m_pDbWrapper zeigt belegt. Es scheint auch zu funktionieren. Giebt es dafür eine schönere Lösung, ohne RTTI?</p>
<p>Danke für Eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/120543/mehrfachvererbung-ptr-vergleich</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 09:24:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/120543.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Sep 2005 11:06:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 11:08:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>entgegen aller Warnungen hab ich in einem aktuellen Projekt ziemlich viel mehrfach vererbt. Das ganze ist der Tatsache geschuldet, das Design und Implementierung komplett getrennt sein sollten (Header komplett Plattformunabhängig, Implementierung DAO und Windows) und die einzelnen Abstraktionebenen unabhängig voneinander in verschiedenen Projekten genutzt werden. Wenn ich zu Projektbeginn schon ein bisschen mehr Erfahrung mit Templates gehabt hätte, wäre die Lösung sicher eleganter geworden - egal:</p>
<pre><code class="language-cpp">template&lt;class TDbReadWrapper&gt;
class DbObserver : public IDbReadObserver
{
	DbOpener* GetOpener(void){return m_pDbWrapper;}
        bool EqualsPtr( const void* pPtr )const//tests for equality to the given Ptr
		{ 
			return ( (pPtr &gt;= m_pDbWrapper) &amp;&amp; (pPtr &lt; ( m_pDbWrapper + sizeof(TDbReadWrapper) ) ) );//liegt der Ptr im Speicherbereich des m_pDbWrapper???
		}
        TDbReadWrapper* m_pDbWrapper;
}
</code></pre>
<p>Ich muß zu bestimmten Gegebenheiten checken, ob ein bestimmter DbOpener dem gewrapptem m_pDbWrapper entspricht. Einen vernünftigen op== kann ich dafür nicht schreiben. Also vergleiche ich die Ptr. Der von GetOpener zurückgelieferte Ptr zeigt aber schon auf einen anderen Speicherbereich als der zugehörige m_pDbWrapper. Also vergleiche ich in EqualsPtr, ob der gegebene Ptr in dem Bereich liegt, den die Instanz, auf die m_pDbWrapper zeigt belegt. Es scheint auch zu funktionieren. Giebt es dafür eine schönere Lösung, ohne RTTI?</p>
<p>Danke für Eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871850</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 14 Sep 2005 11:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 11:24:02 GMT]]></title><description><![CDATA[<p>Autsch..</p>
<p>Ich bin dieser Sache dahingehend aus dem Weg gegangen, dass ich eine virutelle Funktion definiert habe:</p>
<pre><code class="language-cpp">virtual ETYPE GetType () { return ETYPE::E_MYSPECIALCLASS; }
</code></pre>
<p>und diese in Abhängigkeit von der Implementierungs-Klasse ändere. Auf diese Weise kann ich immer abfragen was für ein Typ sich tatsächlich hinter der Schnittstelle verbirgt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871867</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Sep 2005 11:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 11:45:40 GMT]]></title><description><![CDATA[<p>Typsicherheit als solches ist im Design schon sichergestellt. Die Variante mit einer eigene ID für jedes Objekt ist in meinem Fall ein bisschen umständlich und im Fall Mehrfachvererbung auch ein bisschen unübersichtlich.<br />
Es geht wirklich nur um diesen Pointer-Vergleich, da ich keine Kontrolle habe, wie der Anwender meine Klassen verwendet und kombiniert, um neue Objekte zu kreieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871896</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 14 Sep 2005 11:45:40 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 12:36:13 GMT]]></title><description><![CDATA[<p>Dann verstehe ich dein Problem nicht ganz...</p>
<pre><code class="language-cpp">DbOpener* GetOpener(void){return m_pDbWrapper;}
</code></pre>
<p>Diese Funktion liefert dir doch den Pointer zurueck.. was hindert dich daran diesen mit einem anderen Pointer zu ueberpruefen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871954</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Sep 2005 12:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 13:07:25 GMT]]></title><description><![CDATA[<p>Macht es sinn ?<br />
Wäre es nicht sinnvoller die 2 Objekte zu vergleichen,<br />
die den Pointer enthalten ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871997</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 14 Sep 2005 13:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 13:22:06 GMT]]></title><description><![CDATA[<p>Wie geschrieben : wegen der Mehrfachvererbung zeigt DbOpener nicht auf m_pDbWrapper, sondern auf (m_pDbWrapper + X). Ich werde mal vesuchen, ein kleines Beispiel nachzustricken, was man hoffentlich nachvollziehen kann:</p>
<pre><code class="language-cpp">struct BaseA
{
	virtual void DoSomeThingA(void) = 0;
	bool bMemberA_;
};
struct BaseB
{
	virtual void DoSomeThingB(void) = 0;
	bool bMemberB_;
};
struct MultiDerived : public BaseA, public BaseB
{
	void DoSomeThingA(void){ cout &lt;&lt; &quot;I'm an A&quot; &lt;&lt; endl; }
	void DoSomeThingB(void){ cout &lt;&lt; &quot;I'm an B&quot; &lt;&lt; endl; }
	bool bSomeOther_;
};
template &lt; class TWrapped &gt;
struct Wrapper
{
	Wrapper( TWrapped* pWrap ) : pWrapped_(pWrap){}
	BaseB* GetMyB(void){ return pWrapped_; }
	TWrapped* pWrapped_;
};

Wrapper&lt;MultiDerived&gt;* pWrapper = new Wrapper&lt;MultiDerived&gt;( new MultiDerived );
	BaseB* pBaseB = pWrapper-&gt;GetMyB();
	assert( (pBaseB &gt;= (void*)pWrapper-&gt;pWrapped_ ) &amp;&amp; (pBaseB &lt; ((void*)(pWrapper-&gt;pWrapped_ + sizeof(MultiDerived)))) );//OK
	assert( ((void*)pWrapper-&gt;pWrapped_) == pBaseB );//failure
</code></pre>
<p>Hab der Einfachheit halber mal alles public in structs gesteckt. Den Wrapper könnte ich mir für das Beispiel eigentlich sparen. Jedenfalls Zeigt pWrapper-&gt;pWrapped_ auf was anderes als der return von GetMyB (auch irgendwie logisch). Ich sehe hal keinen anderen weg als so festzustellen, ob ein Pointer dazugehört oder nicht.<br />
Frage war eigentlich eher, ob das in irgendeinem Fall Fehlschlagen kann.</p>
<p>Danke schonmal für Deine Hilfe, das hat mich zumindest mal animiert das ganze in ein kleines Beispiel zu packen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/872015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872015</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 14 Sep 2005 13:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 13:28:10 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/642">@phlox81</a></p>
<p>Wäre schon sauberer, ich müßte dann aber jedes Objekt, mit jedem beliebigen anderen im Projekt vergleichen können, d.h. nur für diesen einen Test jedem Objekt einen op== spendieren. Wie gesagt, das sind größtenteils Datenbank Verbindungen (Wrapper und sonstiges DB-Zeug <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="🙂"
    /> ), und theoretisch wäre es möglich das zwei Instanzen die gleichen Verbindungsdaten haben und trotzdem unterschiedliche Zwecke erfüllen (Reader, Writer).<br />
Im Prinzip alles nur Ausreden, um nicht den Aufwand mit dem op== zu haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/872021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872021</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 14 Sep 2005 13:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 14:08:42 GMT]]></title><description><![CDATA[<p>Sagt dir der Begriff Typ-Konvertierung was?</p>
<p>Der Compiler ist in der Lage jedes Objekt über die Schnittstelle der Oberklasse anzusprechen (und auch automatisch).<br />
Das funktioniert solange, wie man nicht auf die Idee kommt an dieser Stelle mit Void-Pointern zu arbeiten.</p>
<p>Wenn du einen void-Pointer übergibst nimmt der Compiler einfach den Pointer den er hat. Wenn du aber DbOpener* übergibst wandelt er Compiler die Adresse automatisch um.</p>
<p>Böse (und ohne Nutzen, da m_pDbWrapper immer DbOpener als Basisklasse haben muss):</p>
<pre><code class="language-cpp">bool      EqualTo  (const void * pPtr )const;
</code></pre>
<p>Richtig:</p>
<pre><code class="language-cpp">bool      EqualTo  (const DbOpener* pPtr )const;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/872071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872071</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Sep 2005 14:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Wed, 14 Sep 2005 14:24:16 GMT]]></title><description><![CDATA[<blockquote>
<p>, da m_pDbWrapper immer DbOpener als Basisklasse haben muss):</p>
</blockquote>
<p>Wer sagt das?</p>
<blockquote>
<p>bool EqualTo (const DbOpener* pPtr )const;</p>
</blockquote>
<p>Auch richtig, setzt aber voraus, das deine 1. Annahme stimmt und legt mich auf DbOpener fest. Das ist für den Zweck, den die Funktion erfüllen soll nicht unbedingt zwingend.</p>
<p>Ich gebe Dir recht, das die Variante mit dem void* dort sicher nicht die schönste ist. Ich werd nochmal darüber nachdenken, ob die Einschränkung, das ich nur mit DbOpener vergleichen kann irgendwie hinnehmbar ist.<br />
Zumindest habe ich jetzt gelernt, warum eine abstract class keine Datenmember haben sollte <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/872083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872083</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 14 Sep 2005 14:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfachvererbung Ptr Vergleich on Thu, 15 Sep 2005 06:01:13 GMT]]></title><description><![CDATA[<p>Das sagt mir mein klarer Menschenverstand.</p>
<p>Wenn das Objekt das du vergleich willst nicht über die Schnittstelle von DbOpener verfügt, dann kann es nicht identisch mit m_pDbWrapper sein.<br />
(Einzige Ausnahme: Du hast das Objekt ueber die Schnittstelle der zweiten<br />
Basisklasse vorliegen und du willst es damit vergleichen. Ist nicht schön<br />
aber kommt vor.<br />
An der Stelle könntest du allerdings einen C-Cast verwenden, um die richtige<br />
Adresse heraus zu finden. Der ist zwar nicht sicher aber da es dir bei dem<br />
Pointer nur um einen Adressvergleich geht fände ich dies besser.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/872105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872105</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Thu, 15 Sep 2005 06:01:13 GMT</pubDate></item></channel></rss>