<?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[Comparer-Problem in Set ???]]></title><description><![CDATA[<p>Hallo Gemeinde,<br />
habe folgendes Problem:<br />
Eine Klasse B hat einen set&lt;A*&gt; mit Zeiger auf Objete von der Klasse A.<br />
Nun will ich aber eine spezielle Anordnung von A-Objekten im Set implementieren. Eigentlich kann man das so machen:</p>
<pre><code>Class A
{}

Class B
{
struct Com
 {
   bool operator()(const A* i, const A* j) const
   {
     return ... // do compare
   }
 }

 std::set&lt;A*,Com&gt;;
}
</code></pre>
<p>So weit würde das funktionieren. Aber das Problem ist, dass ist in der Funktion operator() auf die Klasse B selbst zugreifen muss, d.h. z.B.</p>
<pre><code>Class B
{
 struct Com
 {
   bool operator()(const A* i, const A* j) const
   {
     return getSomeProperty(i) &lt; getSomeProperty(j);
   }
 }

 int getSomeProperty(const A* i) const
 { return ..//some property of i }

 std::set&lt;A*,Com&gt;;
}
</code></pre>
<p>und das geht natürlich nicht, da getSomeProperty nicht statisch ist und in Com nicht sichtbar. Aus Designgründen kann ich die Referenz auf B in A nicht speichern (so dass ich auf B-Objekt über A zugreifen kann.<br />
Kann man das irgendwie lösen?<br />
Kann man bei der Deklaration von set anstatt von Com eine boolesche Funktion von B irgendwie übergeben? Dann könnte sie nähmlich auf die lokale Datenstrukturen zugreifen.<br />
Irgendwie sowas:</p>
<pre><code>Class B
{
  bool compare(const A* i, const A* j) const
  {
    return getSomeProperty(i) &lt; getSomeProperty(j);
  }

 int getSomeProperty(const A* i) const
 { return ..//some property of i }

 std::set&lt;A*,[b]compare[/b]&gt;;
}
</code></pre>
<p>Aber das geht ja so nicht... Hat jemand eine Lösund?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166416/comparer-problem-in-set</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 09:23:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166416.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Nov 2006 22:38:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Comparer-Problem in Set ??? on Tue, 28 Nov 2006 22:38:56 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,<br />
habe folgendes Problem:<br />
Eine Klasse B hat einen set&lt;A*&gt; mit Zeiger auf Objete von der Klasse A.<br />
Nun will ich aber eine spezielle Anordnung von A-Objekten im Set implementieren. Eigentlich kann man das so machen:</p>
<pre><code>Class A
{}

Class B
{
struct Com
 {
   bool operator()(const A* i, const A* j) const
   {
     return ... // do compare
   }
 }

 std::set&lt;A*,Com&gt;;
}
</code></pre>
<p>So weit würde das funktionieren. Aber das Problem ist, dass ist in der Funktion operator() auf die Klasse B selbst zugreifen muss, d.h. z.B.</p>
<pre><code>Class B
{
 struct Com
 {
   bool operator()(const A* i, const A* j) const
   {
     return getSomeProperty(i) &lt; getSomeProperty(j);
   }
 }

 int getSomeProperty(const A* i) const
 { return ..//some property of i }

 std::set&lt;A*,Com&gt;;
}
</code></pre>
<p>und das geht natürlich nicht, da getSomeProperty nicht statisch ist und in Com nicht sichtbar. Aus Designgründen kann ich die Referenz auf B in A nicht speichern (so dass ich auf B-Objekt über A zugreifen kann.<br />
Kann man das irgendwie lösen?<br />
Kann man bei der Deklaration von set anstatt von Com eine boolesche Funktion von B irgendwie übergeben? Dann könnte sie nähmlich auf die lokale Datenstrukturen zugreifen.<br />
Irgendwie sowas:</p>
<pre><code>Class B
{
  bool compare(const A* i, const A* j) const
  {
    return getSomeProperty(i) &lt; getSomeProperty(j);
  }

 int getSomeProperty(const A* i) const
 { return ..//some property of i }

 std::set&lt;A*,[b]compare[/b]&gt;;
}
</code></pre>
<p>Aber das geht ja so nicht... Hat jemand eine Lösund?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183457</guid><dc:creator><![CDATA[ganz verzweifelt]]></dc:creator><pubDate>Tue, 28 Nov 2006 22:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Comparer-Problem in Set ??? on Wed, 29 Nov 2006 07:11:55 GMT]]></title><description><![CDATA[<p>Du könntest dem Comparator (nicht der Klasse A) eine Referenz auf das Objekt mitgeben, das zum Vergleich genutzt werden soll:</p>
<pre><code class="language-cpp">class B
{
  struct Comparator
  {
    bool operator()(const A* l,const A* r) const
    {
      return m_base.getProperty(l)&lt;m_base.getProperty(r);
    }
    Comparator(const B&amp; base) : m_base(base) {}
    const B&amp; m_base;
  };

  set&lt;A*,Comparator&gt; m_set;

  B() : m_set(Comparator(*this)) {}
};
</code></pre>
<p>Allerdings solltest du darafu achten, daß getProperty für ein gegebenes Objekt immer den selben Wert zurückliefert, sonst könnte es die Integrität der set&lt;&gt; zerstören.</p>
<p>(eine Alternative wäre es vermutlich, getProperty() als Element von A zu implementieren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183520</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 29 Nov 2006 07:11:55 GMT</pubDate></item></channel></rss>