<?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[Objekte unterscheiden: Funktion ist_ein(...) implementieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte für mein Projekt gerne folgende Funktionalität, die ich aus einem anderen Projekt kenne, aber nicht mehr genau weiss, wie sie realisiert wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich hätte gerne in jeder Klasse eine öffentliche Funktion</p>
<pre><code class="language-cpp">virtual bool ist_ein(const CKlassenBeschreiber&amp;)
</code></pre>
<p>die mir &quot;wahr&quot; liefert, wenn ein Objekt der Klasse entspricht.</p>
<p>Nehmen wir an, ich hätte die Klassen &quot;Fahrzeug&quot;, davon abgeleitet &quot;Auto&quot;.<br />
Nun habe ich einen Zeiger auf ein Auto (wobei ich nicht weiss, dass es sich um ein Auto handelt), dann soll die Funktion ist_ein(AUTO) true liefern und der Aufruf ist_ein(FAHRZEUG) ebenfalls.</p>
<p>In der Implementierung, die ich mal gesehen habe, hatte jede Klasse ein Objekt</p>
<pre><code class="language-cpp">extern const CKlassenBeschreiber AUTO //bzw. FAHRZEUG
</code></pre>
<p>Leider fehlt mir der entscheidende Ansatz.</p>
<p>Kann mir jemand helfen? Seh ich vielleicht den Wald vor lauter Bäumen nicht oder ist es doch nicht so trivial? Was ist mit typeid etc.? Hilft mir ja nicht, wenn ich auch Basisklassen erkennen will oder?</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/130394/objekte-unterscheiden-funktion-ist_ein-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 15:12:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/130394.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Dec 2005 15:30:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 15:30:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte für mein Projekt gerne folgende Funktionalität, die ich aus einem anderen Projekt kenne, aber nicht mehr genau weiss, wie sie realisiert wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich hätte gerne in jeder Klasse eine öffentliche Funktion</p>
<pre><code class="language-cpp">virtual bool ist_ein(const CKlassenBeschreiber&amp;)
</code></pre>
<p>die mir &quot;wahr&quot; liefert, wenn ein Objekt der Klasse entspricht.</p>
<p>Nehmen wir an, ich hätte die Klassen &quot;Fahrzeug&quot;, davon abgeleitet &quot;Auto&quot;.<br />
Nun habe ich einen Zeiger auf ein Auto (wobei ich nicht weiss, dass es sich um ein Auto handelt), dann soll die Funktion ist_ein(AUTO) true liefern und der Aufruf ist_ein(FAHRZEUG) ebenfalls.</p>
<p>In der Implementierung, die ich mal gesehen habe, hatte jede Klasse ein Objekt</p>
<pre><code class="language-cpp">extern const CKlassenBeschreiber AUTO //bzw. FAHRZEUG
</code></pre>
<p>Leider fehlt mir der entscheidende Ansatz.</p>
<p>Kann mir jemand helfen? Seh ich vielleicht den Wald vor lauter Bäumen nicht oder ist es doch nicht so trivial? Was ist mit typeid etc.? Hilft mir ja nicht, wenn ich auch Basisklassen erkennen will oder?</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947904</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Thu, 22 Dec 2005 15:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 15:45:02 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>dazu kannst du dynamic_cast&lt;&gt; benutzen.</p>
<pre><code class="language-cpp">Fahrzeug *MeinFahrzeug;
...
Auto *MeinAuto = dynamic_cast&lt;Auto *&gt;(MeinFahrzeug);
if (MeinAuto)
{
  // MeinnFahrzeug war vom Typ Auto
  }
</code></pre>
<p>Dazu must du in deinem Compiler aber die RTTI aktivieren.</p>
<p>Allerdings ist es besser, wenn du durch eine geeignete Basisklasse (mit virtuellen Methoden) nicht wissen must, von welchem Typ die Instanz letztendich ist.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947917</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 Dec 2005 15:45:02 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 15:59:16 GMT]]></title><description><![CDATA[<p>Muß man für einen dynamic_cast wirklich RTTI aktivieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947938</guid><dc:creator><![CDATA[RTTI]]></dc:creator><pubDate>Thu, 22 Dec 2005 15:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 16:03:16 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Überleg dir mal, was <a href="http://de.wikipedia.org/wiki/RTTI" rel="nofollow">RTTI</a> bedeutet und was den der <em>dynamic_cast</em> überprüfen soll.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947942</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 Dec 2005 16:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 16:19:47 GMT]]></title><description><![CDATA[<p>OK, aber</p>
<pre><code class="language-cpp">Auto* mercedes = new Auto();
</code></pre>
<p>Dann funktioniert</p>
<pre><code class="language-cpp">if(mercedes-&gt;ist_ein(FAHRZEUG))
{...}
</code></pre>
<p>aber nicht oder?</p>
<p>D.h. ich kann keine Rückschlüsse auf die Basisklasse ziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947957</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Thu, 22 Dec 2005 16:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Thu, 22 Dec 2005 17:05:04 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>nein, so geht das in C++ nicht. Wie so etwas gemacht werden kann, hab ich dir doch schon geschrieben.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/947987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/947987</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 Dec 2005 17:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Fri, 23 Dec 2005 08:21:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Hallo</p>
<p>nein, so geht das in C++ nicht. Wie so etwas gemacht werden kann, hab ich dir doch schon geschrieben.</p>
<p>bis bald<br />
akari</p>
</blockquote>
<p>Das ist nicht zufriedenstellend! Ich will doch nicht casten <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>
<p>Also hier mein einfacher Vorschlag:</p>
<pre><code class="language-cpp">class CKlassenBeschr
{
private:
	const int fid;
	static int sid;
public:
	CKlassenBeschr();

	virtual ~CKlassenBeschr();

	const int gib_id() const { return fid; };
};

const bool operator==(const CKlassenBeschr&amp; akbl, const CKlassenBeschr&amp; akbr);
</code></pre>
<pre><code class="language-cpp">#include &quot;klassenbeschr.h&quot;

int CKlassenBeschr::sid = 0;

CKlassenBeschr::CKlassenBeschr():fid(sid)
{
	sid++;
}

CKlassenBeschr::~CKlassenBeschr()
{
}

 const bool operator==(const CKlassenBeschr&amp; akbl, const CKlassenBeschr&amp; akbr)
 { 
	 return akbl.gib_id()==akbr.gib_id()?true:false; 
 };
</code></pre>
<pre><code class="language-cpp">const CKlassenBeschr C_KLASSE;

class CKlasse:public CKlasse2
{
private:	
public:
	CKlasse();
        const bool ist_ein(const CKlassenBeschr &amp; akb) const { return (akb==C_KLASSE || CKlasse2::ist_ein(akb))?true:false; } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/948323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948323</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Fri, 23 Dec 2005 08:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Fri, 23 Dec 2005 08:27:31 GMT]]></title><description><![CDATA[<p>Ja, das ist auch eine Möglichkeit - nur solltest du die CKlassenBeschr eventuell etwas anpassen:<br />
* virtueller Destruktor ist unnötig (oder willst du etwas davno ableiten?)<br />
* ob Kopien nötig sind, weiß ich auf Anhieb nicht - eventuell könntest du Copy-Ctor und op= privat deklarieren<br />
* staische globale Objekte werden in zufälliger Reihenfolge initialisiert - also bekommst du vermutlich Probleme, wenn eins deiner Class-ID Objekte vor CKlassenBeschr::sid angelegt wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948328</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 23 Dec 2005 08:27:31 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Fri, 23 Dec 2005 10:44:18 GMT]]></title><description><![CDATA[<p>Noch ein Tipp wegen den statischen sachen...<br />
Du kannst es auch so machen;</p>
<pre><code class="language-cpp">class Klasse
{
public:
  static char dummy;
  const int gib_id() { return reinterpret_cast&lt;int&gt;(&amp;dummy); }
}
</code></pre>
<p>Nimmt man die Adresse hat man zwei Vorteile:<br />
- Sie ist eindeutig<br />
- Sie ist auf jeden Fall initialisiert</p>
<p>Bei Deiner Idee könnte man doch zum Beispiel sagen jeder &quot;BasisTyp&quot; bekommt eine Primzahl als Typ-Id. Jeder abgeleitete Typ hat die Typ_id: BasisTypId * die BasisPrimzahl. Damit könnte man ja sogar Mehrfachableitungen hinkriegen. Oder? (Nicht für riesen Projekte geeignet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948422</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Fri, 23 Dec 2005 10:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Fri, 23 Dec 2005 12:07:05 GMT]]></title><description><![CDATA[<p>Danke Leute, prima Ideen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> !!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/948492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/948492</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Fri, 23 Dec 2005 12:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte unterscheiden: Funktion ist_ein(...) implementieren on Wed, 28 Dec 2005 23:27:12 GMT]]></title><description><![CDATA[<p>Schon klar, dass RTTI Informationen zur Laufzeit bereitstellt</p>
<p>Aber stehen in der vtable nicht eh die typids und die werden dann verglichen?</p>
<p>Also möchte ich die Frage nochmal in den Raum stellen</p>
<p>Muß man für einen dynamic_cast wirklich RTTI aktivieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951846</guid><dc:creator><![CDATA[RTTI]]></dc:creator><pubDate>Wed, 28 Dec 2005 23:27:12 GMT</pubDate></item></channel></rss>