<?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[Objekt eindeutig identifizieren]]></title><description><![CDATA[<p>Ich hab ein Objekt, welches sich WidgetBase schimpft. Dies soll als Basisklasse für alle Widgets dienen, die ich erstelle. Nun möchte ich aber jedes Objekt eindeutig identifizieren können. Jedes Widget hat bereits eine ID und einen Namen (string). Allerdings möchte ich mich nicht nur darauf verlassen.<br />
Wie kann ich hier ein Objekt eindeutig identifizieren wenn ich einen Zeiger auf beide Objekte habe?<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261750/objekt-eindeutig-identifizieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 03:39:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261750.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Feb 2010 12:12:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 12:12:13 GMT]]></title><description><![CDATA[<p>Ich hab ein Objekt, welches sich WidgetBase schimpft. Dies soll als Basisklasse für alle Widgets dienen, die ich erstelle. Nun möchte ich aber jedes Objekt eindeutig identifizieren können. Jedes Widget hat bereits eine ID und einen Namen (string). Allerdings möchte ich mich nicht nur darauf verlassen.<br />
Wie kann ich hier ein Objekt eindeutig identifizieren wenn ich einen Zeiger auf beide Objekte habe?<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860022</guid><dc:creator><![CDATA[leetfan]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 12:13:52 GMT]]></title><description><![CDATA[<p>Du vermischst Objekte mit Klassen.</p>
<p>Objekte sind durch ihre Adresse eindeutig.<br />
Klassen sind durch ihre Typ-ID ( <code>std::type_info</code> ) eindeutig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860023</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 12:19:15 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du vermischst Objekte mit Klassen.</p>
<p>Objekte sind durch ihre Adresse eindeutig.<br />
Klassen sind durch ihre Typ-ID ( <code>std::type_info</code> ) eindeutig.</p>
</blockquote>
<p>Ein Objekt ist doch im Endeffekt eine Instanz einer Klasse, richtig?<br />
Und genau eben jedes einzelne Objekt möchte ich zu 100% identifizieren können^^.<br />
Also reicht ein einfacher Zeigervergleich?</p>
<pre><code class="language-cpp">bool compare(const WidgetBase* a, const WidgetsBase* b)
{
   if ( a == b )
      return true;
   return false;
}
</code></pre>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860025</guid><dc:creator><![CDATA[leetfan]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 12:41:41 GMT]]></title><description><![CDATA[<p>leetfan schrieb:</p>
<blockquote>
<p>Ein Objekt ist doch im Endeffekt eine Instanz einer Klasse, richtig?</p>
</blockquote>
<p>Genau. Stutzig gemacht hat mich diese Aussage:</p>
<p>leetfan schrieb:</p>
<blockquote>
<p>Ich hab ein Objekt, welches sich WidgetBase schimpft. Dies soll als Basisklasse für alle Widgets [...]</p>
</blockquote>
<p><code>WidgetBase</code> ist eben kein Objekt. Falls du ein Objekt der Klasse <code>WidgetBase</code> meintest, hab ich dich wohl falsch verstanden. <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>
<p>leetfan schrieb:</p>
<blockquote>
<p>Und genau eben jedes einzelne Objekt möchte ich zu 100% identifizieren können^^.<br />
Also reicht ein einfacher Zeigervergleich?</p>
</blockquote>
<p>Ja, aber das geht auch einfacher:</p>
<pre><code class="language-cpp">bool compare(const WidgetBase* a, const WidgetsBase* b)
{
   return a == b;
}
</code></pre>
<p>Aber du willst schon, dass es sich um dasselbe Objekt mit selber Adresse handelt? Um zwei Objekte auf semantische Gleichheit zu prüfen, nimmst du lieber <code>operator==</code> , kannst aber nichts Einzigartiges wie die Adresse als Vergleichskriterium nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860037</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:41:41 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 12:47:53 GMT]]></title><description><![CDATA[<p>Die Adresse eines Objektes kann sich aber auch verändern, wenn dieses zB in einem Container liegt und umkopiert wird. Sollte man auch bedenken (beim Test auf Gleichheit egal, bei komplexeren Sachen aber evtl ein Problem).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860039</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 23 Feb 2010 12:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 13:32:26 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Die Adresse eines Objektes kann sich aber auch verändern, wenn dieses zB in einem Container liegt und umkopiert wird. Sollte man auch bedenken (beim Test auf Gleichheit egal, bei komplexeren Sachen aber evtl ein Problem).</p>
</blockquote>
<p>Da alle &quot;Kinder&quot; eines Eltern-Objekts in einem Container liegen könnte das zutreffen. Wie könnte man das umgehen? Am Ende nur durch festlegen einer eindeutigen ID innerhalb des Objekts oder?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Ja, so meinte ich das hehe.<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860065</guid><dc:creator><![CDATA[leetfan]]></dc:creator><pubDate>Tue, 23 Feb 2010 13:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 13:35:08 GMT]]></title><description><![CDATA[<p>Indem in dem Container nur Pointer auf die Objekte liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860066</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 23 Feb 2010 13:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 13:41:31 GMT]]></title><description><![CDATA[<p>Oder durch Wahl eines Containers, der seine Objekte nicht umkopieren muss (z.B. <code>std::list</code> ). Hat zudem den Vorteil, dass alle Zeiger, Referenzen und Iteratoren auf die Elemente gültig bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860069</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 13:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:00:31 GMT]]></title><description><![CDATA[<p>Als Member-ID könnte man sich eine kleine Klasse schreiben. Die kann auch fürs Debugging hilfreich sein.</p>
<pre><code class="language-cpp">class unique_id
{
	public:
		unique_id()
		: m_id(next_id++)
		{
		}

		unique_id(const unique_id&amp;)
		: m_id(next_id++)
		{
		}

		unique_id&amp; operator= (const unique_id&amp;)
		{
			return *this;
		}

		unsigned long get() const
		{
			return m_id;
		}

	private:
		unsigned long m_id;
		static unsigned long next_id;
};

unsigned long unique_id::next_id;

bool operator== (const unique_id&amp; lhs, const unique_id&amp; rhs)
{
	return lhs.get() == rhs.get();
}

bool operator!= (const unique_id&amp; lhs, const unique_id&amp; rhs)
{
	return !(lhs == rhs);
}
</code></pre>
<p>Sieht gerade jemand Probleme mit diesem Ansatz? Für Multithreading wäre die <code>static</code> -Variable nicht so geeignet, aber sonst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860075</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:02:16 GMT]]></title><description><![CDATA[<p>Was ist wenn ein Objekt kopiert wird? Wird die ID dann auch kopiert? Oder eine neue erstellt? Will der Benutzer das usw. usf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860076</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:16:34 GMT]]></title><description><![CDATA[<p>Bei einer Kopie wird eine neue Identifikationsnummer erstellt (steht im Code :)). Ich denke schon, dass das im Sinne des Benutzers ist, schliesslich soll die ID ja jede Instanz eindeutig kennzeichnen, und eine Kopie führt zu einer neuen Instanz.</p>
<p>Die Vorteile gegenüber der Adresse sehe ich vor allem beim Debugging: Man ist nicht mit kryptischen Hexadezimalzahlen konfrontiert und kann anhand der ID die Erzeugungsreihenfolge der Instanzen rekonstruieren. Ansonsten braucht man die Eigenschaft wohl nicht sehr häufig, bzw. kommt mit dem Adressoperator schon recht weit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860082</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:43:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Bei einer Kopie wird eine neue Identifikationsnummer erstellt (steht im Code :)). Ich denke schon, dass das im Sinne des Benutzers ist, schliesslich soll die ID ja jede Instanz eindeutig kennzeichnen, und eine Kopie führt zu einer neuen Instanz.</p>
<p>Die Vorteile gegenüber der Adresse sehe ich vor allem beim Debugging: Man ist nicht mit kryptischen Hexadezimalzahlen konfrontiert und kann anhand der ID die Erzeugungsreihenfolge der Instanzen rekonstruieren. Ansonsten braucht man die Eigenschaft wohl nicht sehr häufig, bzw. kommt mit dem Adressoperator schon recht weit.</p>
</blockquote>
<p>Also ein Objekt soll nicht kopiert werden, sondern ein neues angelegt werden. Die sollen alle einzigartig sein. Jede Instanz der Klasse ist Teil einer Oberfläche, daher sollen hier keine Dubletten vorkommen. Die ID in dem Fall wird eigentlich dazu verwendet in den Events zu erkennen, auf welchem Widget das Event stattfand wie MouseMove/MouseClick etc. Ich möchte nur Kinder eines ElternWidgets wie eines Panels im Container eindeutig identifizieren. Wenn Zeiger nicht umkopiert werden, dann sollte das hier so auch funktionieren:</p>
<pre><code class="language-cpp">class EXPORT WidgetBase : public IGameObject
{
    typedef std::vector&lt;WidgetBase*&gt; ChildWidgetList;

public:
    WidgetBase(int id, WidgetBase* parent = NULL, std::string name = &quot;&quot;)
        :IGameObject(name), m_parent(parent), m_id(-1)
    {
    }

    virtual ~WidgetBase()
    {
        for ( u32 i = 0; i &gt;= m_childs.size(); i++ )
        {
            WidgetBase* c = m_childs[i];
            delete c;
        }
    }

    void addChild(WidgetBase* child)
    {
        m_childs.push_back(child);
    }

    const WidgetBase* getParent() const { return m_parent; }

    int getId() const { return m_id; }

    bool isChildOf(const WidgetBase* parent)
    {
        if ( this-&gt;getParent() != NULL )
           return ( this-&gt;getParent() == parent );
    }

    bool hasChild(const WidgetBase* child)
    {
        for ( u32 i = 0; i &gt;= m_childs.size(); i++ )
        {
            WidgetBase* c = m_childs[i];
            if ( c == child )
            {
                return true;
            }
        }
        return false;
    }

    virtual void renderObject() = 0;

protected:
    WidgetBase*   m_parent;
    ChildWidgetList m_childs;
    int m_id;

};
</code></pre>
<p>Es handelt sich die Basis für eine OpenGL-GUI. Bitte jetzt net nach Spiele verschieben, is ja nen reines C++-Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> .</p>
<p>ps.: Euer Spambuster spielt verrückt<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860100</guid><dc:creator><![CDATA[leetfan]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:49:03 GMT]]></title><description><![CDATA[<p>@OP/all:<br />
Wenn ein Objekt eine &quot;Identität&quot; hat, dann sollte man es auch nicht kopieren können -&gt; boost::noncopyable o.ä. verwenden.<br />
D.h. man kann es dann auch nicht in einem Container halten.</p>
<p>Man kann allerdings Zeiger (normale oder auch &quot;smarte&quot;) in einem Container halten. Was ich für eine recht gute Lösung halte.</p>
<p>Objekte die eine &quot;Identität&quot; kopierbar zu machen ist IMO ganz grosser Murks. Dinge wie eine &quot;unique_id&quot;, die dann mitkopiert wird, halte ich auch für einigermassen fragwürdig.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Ich sehe - abgesehen davon dass es wie du selbst schon schreibst nicht threadsafe ist - kein Problem. Nur frage ich mich, wieso du nicht gleich die Adresse verwendest. Oder willst/musst du sicherstellen, dass IDs nie neu vergeben werden, also dass nachdem ein altes Objekt gelöscht wurde die ID des alten Objekts trotzdem nie an ein neues vergeben wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860102</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 14:49:23 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/release/libs/uuid/uuid.html" rel="nofollow">boost.uuid</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860103</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 23 Feb 2010 14:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt eindeutig identifizieren on Tue, 23 Feb 2010 15:13:35 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Ich sehe - abgesehen davon dass es wie du selbst schon schreibst nicht threadsafe ist - kein Problem. Nur frage ich mich, wieso du nicht gleich die Adresse verwendest. Oder willst/musst du sicherstellen, dass IDs nie neu vergeben werden, also dass nachdem ein altes Objekt gelöscht wurde die ID des alten Objekts trotzdem nie an ein neues vergeben wird?</p>
</blockquote>
<p>Ich muss ehrlich sagen, dass ich sowas selbst noch nie verwendet habe, ausser wirklich zum Debuggen. Da war ich erst vor kurzem froh um eine ID, da ich relativ viel mit unterschiedlichen Containern und Querverweisen zu tun hatte und auf diese Weise einen Bug feststellen konnte. Ein <code>std::vector</code> hatte seinen Speicher reallokiert und die Verweise invalidiert, was durch die neuen Element-IDs sehr schnell ersichtlich war.</p>
<p>Das hätte man zwar auch mit Adressen feststellen können, wäre aber einiges mühsamer auszulesen gewesen. Und wie du sagst, könnte eine Adresse durchaus mehrere Male belegt werden, ausserdem weiss man nicht, in welcher Reihenfolge die Objekte konstruiert wurden (was ab und zu eine hilfreiche Information sein kann).</p>
<p>Ansonsten bin ich bisher immer mit der Adresse ausgekommen, sofern ich diese Funktionalität überhaupt benötigt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860118</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Feb 2010 15:13:35 GMT</pubDate></item></channel></rss>