<?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[Listen für Objekte mit abstakter Basisklasse iterieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche momentan, unter Verwendung von list aus der C++Standard-Library, das Entwurfsmuster Beobachter (engl. Observer) zu implementieren.<br />
Dafür brauche ich Listen mit Referenzen auf <strong>beliebige</strong> Kindklassen der abstrakten Basisklasse Observer. Darum greife ich auf das Prinzip der Polymorphie zurück (Instanzen einer Kindklasse sind auch Instanzen ihrer Basisklassen).</p>
<p>Folgend mein momentaner Quellcode:</p>
<pre><code>// Observer.h
#ifndef OBSERVER_H
#define OBSERVER_H

#include &quot;Subject.h&quot;

using namespace std;

class Observer
{
   protected:
      Observer();
   public:
      virtual ~Observer();
      virtual void react(class Subject* subject) = 0;
};

#endif // OBSERVER_H
</code></pre>
<pre><code>// Subject.h
#ifndef SUBJECT_H
#define SUBJECT_H

#include &lt;list&gt;
#include &quot;Observer.h&quot;

using namespace std;

class Subject
{
   private:
      list&lt;class Observer*&gt; observers;
      int value;
   protected:
      Subject();
   public:
      virtual ~Subject();
      void attach(Observer* observer);
      void detach(Observer* onserver);
      void setValue(int value);
      int getValue();
      void notify();
};

#endif // SUBJECT_H
</code></pre>
<pre><code>// Subject.cpp
#include &quot;Subject.h&quot;

void Subject::attach(Observer* observer)
{
   observers.push_back(observer);
}
void Subject::detach(Observer* observer)
{
   observers.remove(observer);
}

void Subject::setValue(int value)
{
   this-&gt;value = value;
}

int Subject::getValue()
{
   return this-&gt;value;
}

void Subject::notify()
{
   list&lt;class Observer*&gt;::iterator it;
   for (it = observers.begin(); it != observers.end(); it++)
      it-&gt;react(this);
}
</code></pre>
<p>Wenn ich diesen Code kompiliere, bekomme ich folgende Fehlermeldung:</p>
<p>`</p>
<p>Subject.cpp:27 error: request for member 'react' in '* it.std::_List_iterator&lt;_Tp&gt;::operator-&gt;&lt;Observer*&gt;()', which is of pointer type 'Observer*' (maybe you meant to use '-&gt;' ?)|</p>
<p>`</p>
<p>Es scheint also so zu sein, dass die Liste bereits von sich aus immer Referenzen speichert, weshalb der Aufruf der react-Methode der Kindklasse von Observer in Zeile 27 scheitert, da der Iterator it vom Typ **Observer, statt vom Typ *Observer ist.</p>
<p>Wie muss Zeile 27 in der Datei Subject.cpp aussehen, damit der Methodenaufruf funktioniert?</p>
<p><strong>Hinweis:</strong> Da die Klasse Observer abstrakt ist, bringt es nichts den Datentyp der Listenelemente von class Observer* zu class Observer zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328446/listen-für-objekte-mit-abstakter-basisklasse-iterieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 17:18:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328446.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Oct 2014 13:29:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 13:29:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche momentan, unter Verwendung von list aus der C++Standard-Library, das Entwurfsmuster Beobachter (engl. Observer) zu implementieren.<br />
Dafür brauche ich Listen mit Referenzen auf <strong>beliebige</strong> Kindklassen der abstrakten Basisklasse Observer. Darum greife ich auf das Prinzip der Polymorphie zurück (Instanzen einer Kindklasse sind auch Instanzen ihrer Basisklassen).</p>
<p>Folgend mein momentaner Quellcode:</p>
<pre><code>// Observer.h
#ifndef OBSERVER_H
#define OBSERVER_H

#include &quot;Subject.h&quot;

using namespace std;

class Observer
{
   protected:
      Observer();
   public:
      virtual ~Observer();
      virtual void react(class Subject* subject) = 0;
};

#endif // OBSERVER_H
</code></pre>
<pre><code>// Subject.h
#ifndef SUBJECT_H
#define SUBJECT_H

#include &lt;list&gt;
#include &quot;Observer.h&quot;

using namespace std;

class Subject
{
   private:
      list&lt;class Observer*&gt; observers;
      int value;
   protected:
      Subject();
   public:
      virtual ~Subject();
      void attach(Observer* observer);
      void detach(Observer* onserver);
      void setValue(int value);
      int getValue();
      void notify();
};

#endif // SUBJECT_H
</code></pre>
<pre><code>// Subject.cpp
#include &quot;Subject.h&quot;

void Subject::attach(Observer* observer)
{
   observers.push_back(observer);
}
void Subject::detach(Observer* observer)
{
   observers.remove(observer);
}

void Subject::setValue(int value)
{
   this-&gt;value = value;
}

int Subject::getValue()
{
   return this-&gt;value;
}

void Subject::notify()
{
   list&lt;class Observer*&gt;::iterator it;
   for (it = observers.begin(); it != observers.end(); it++)
      it-&gt;react(this);
}
</code></pre>
<p>Wenn ich diesen Code kompiliere, bekomme ich folgende Fehlermeldung:</p>
<p>`</p>
<p>Subject.cpp:27 error: request for member 'react' in '* it.std::_List_iterator&lt;_Tp&gt;::operator-&gt;&lt;Observer*&gt;()', which is of pointer type 'Observer*' (maybe you meant to use '-&gt;' ?)|</p>
<p>`</p>
<p>Es scheint also so zu sein, dass die Liste bereits von sich aus immer Referenzen speichert, weshalb der Aufruf der react-Methode der Kindklasse von Observer in Zeile 27 scheitert, da der Iterator it vom Typ **Observer, statt vom Typ *Observer ist.</p>
<p>Wie muss Zeile 27 in der Datei Subject.cpp aussehen, damit der Methodenaufruf funktioniert?</p>
<p><strong>Hinweis:</strong> Da die Klasse Observer abstrakt ist, bringt es nichts den Datentyp der Listenelemente von class Observer* zu class Observer zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421619</guid><dc:creator><![CDATA[ZaHaDum1984]]></dc:creator><pubDate>Fri, 10 Oct 2014 13:29:56 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 13:32:02 GMT]]></title><description><![CDATA[<p>Ich denke da an<br />
(*it)-&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421620</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Oct 2014 13:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 13:42:42 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich denke da an<br />
(*it)-&gt;</p>
</blockquote>
<p>Ja, das hat geholfen. Vielen Dank! <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>Nur zum Verständnis: Ist das als Typumwandlung von Observer** zu Observer* zu verstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421622</guid><dc:creator><![CDATA[ZaHaDum1984]]></dc:creator><pubDate>Fri, 10 Oct 2014 13:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 15:10:41 GMT]]></title><description><![CDATA[<p>ZaHaDum1984 schrieb:</p>
<blockquote>
<p>Nur zum Verständnis: Ist das als Typumwandlung von Observer** zu Observer* zu verstehen?</p>
</blockquote>
<p>Nö.<br />
in einem vector&lt;int&gt; sind ints und <em>it ist ein int.<br />
in einem vector&lt;Obersver</em>&gt; sind Obersver* und *it ist ein Obersver*.<br />
Wobei sich ein vector&lt;Obersver*&gt;::iterator ähnlich wie ein Observer** verhält, was ++ und * und so angeht, genau wie ein vector&lt;int&gt;::iterator sich fast wie ein int* anfühlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421628</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 10 Oct 2014 15:10:41 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 14:42:40 GMT]]></title><description><![CDATA[<p>Wenn du das nicht nur zur Übung implementierst, würde ich dir zu boost signals2 raten, statt selber etwas zu bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421640</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 10 Oct 2014 14:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 14:47:29 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Wenn du das nicht nur zur Übung implementierst, würde ich dir zu boost signals2 raten, statt selber etwas zu bauen.</p>
</blockquote>
<p>Das ist eine Aufgabe, die ich für mein Studium machen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421642</guid><dc:creator><![CDATA[ZaHaDum1984]]></dc:creator><pubDate>Fri, 10 Oct 2014 14:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Fri, 10 Oct 2014 14:55:40 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>in einem vector&lt;Observer*&gt; sind Observer* und *it ist ein Observer*.</p>
</blockquote>
<p>FTFY <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/2421644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421644</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 10 Oct 2014 14:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to Listen für Objekte mit abstakter Basisklasse iterieren on Sat, 11 Oct 2014 09:54:25 GMT]]></title><description><![CDATA[<p>Ich habe noch etwas recherchiert.</p>
<p>Seit C++11 lässt sich Subject::notify() auch wie folgt schreiben.</p>
<pre><code>void Subject::notify()
{
   for (auto observer: observers) observer-&gt;react(this);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2421737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421737</guid><dc:creator><![CDATA[ZaHaDum1984]]></dc:creator><pubDate>Sat, 11 Oct 2014 09:54:25 GMT</pubDate></item></channel></rss>