<?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[TThread bzw. TForm Klassen -&amp;gt; Vererbung mit FEhlermeldung]]></title><description><![CDATA[<p>Egal ob ich das jetzt mit einer Klasse von TThread oder TForm mache, bekomme ich eine Fehlermeldung.</p>
<pre><code>[C++ Fehler] Unit3.h(12): E2246 Subject ist keine abstrakte, public, einzelne Vererbungs-Klassenhierarchie ohne Daten
</code></pre>
<p>(Natürlich für alle abgeleiteten Klassen)</p>
<pre><code>class TestThread : public TThread, public Subject
</code></pre>
<pre><code>class TestForm : public TForm, public Observer
</code></pre>
<pre><code>#include &lt;list&gt;
#include &lt;algorithm&gt;

using namespace std;

class Subject;

class Observer
{
public:
	virtual void update( Subject* );
};

class Subject
{
public:
	void Attach_Observer( Observer* );
	void Detach_Observer( Observer* );
	void Notify_All();
private:
	list&lt;Observer*&gt; observers;
};
</code></pre>
<pre><code>#include &quot;ObserverPattern.h&quot;

void Subject::Detach_Observer( Observer* buffer ) //MeldeAb
{
	list&lt;Observer *&gt;::iterator found= std::find(observers.begin(),
												observers.end(),buffer);
	if (found != observers.end()) {
		observers.erase(found);
	}
}

void Subject::Attach_Observer( Observer* buffer ) //MeldeAn
{
	list&lt;Observer *&gt;::const_iterator found= std::find(observers.begin(),
												observers.end(),buffer);
	if (found == observers.end()) {
		observers.push_back(buffer);
	}
}

void Subject::Notify_All() //Benachrichtige
{
	list&lt;Observer *&gt;::iterator walker= observers.begin();
  while(walker != observers.end()) {
		(*walker)-&gt;update(this);
		walker++;
  }
}
</code></pre>
<p>Ich wollte eigentlich das Observer Pattern realisieren, das mir akari empfohlen hat. Mein Code ist die leicht modifizierte Variante des ersten Beispiels aus der Wikipedia.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186839/tthread-bzw-tform-klassen-gt-vererbung-mit-fehlermeldung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 15:18:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186839.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Jul 2007 21:06:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TThread bzw. TForm Klassen -&amp;gt; Vererbung mit FEhlermeldung on Thu, 12 Jul 2007 21:06:07 GMT]]></title><description><![CDATA[<p>Egal ob ich das jetzt mit einer Klasse von TThread oder TForm mache, bekomme ich eine Fehlermeldung.</p>
<pre><code>[C++ Fehler] Unit3.h(12): E2246 Subject ist keine abstrakte, public, einzelne Vererbungs-Klassenhierarchie ohne Daten
</code></pre>
<p>(Natürlich für alle abgeleiteten Klassen)</p>
<pre><code>class TestThread : public TThread, public Subject
</code></pre>
<pre><code>class TestForm : public TForm, public Observer
</code></pre>
<pre><code>#include &lt;list&gt;
#include &lt;algorithm&gt;

using namespace std;

class Subject;

class Observer
{
public:
	virtual void update( Subject* );
};

class Subject
{
public:
	void Attach_Observer( Observer* );
	void Detach_Observer( Observer* );
	void Notify_All();
private:
	list&lt;Observer*&gt; observers;
};
</code></pre>
<pre><code>#include &quot;ObserverPattern.h&quot;

void Subject::Detach_Observer( Observer* buffer ) //MeldeAb
{
	list&lt;Observer *&gt;::iterator found= std::find(observers.begin(),
												observers.end(),buffer);
	if (found != observers.end()) {
		observers.erase(found);
	}
}

void Subject::Attach_Observer( Observer* buffer ) //MeldeAn
{
	list&lt;Observer *&gt;::const_iterator found= std::find(observers.begin(),
												observers.end(),buffer);
	if (found == observers.end()) {
		observers.push_back(buffer);
	}
}

void Subject::Notify_All() //Benachrichtige
{
	list&lt;Observer *&gt;::iterator walker= observers.begin();
  while(walker != observers.end()) {
		(*walker)-&gt;update(this);
		walker++;
  }
}
</code></pre>
<p>Ich wollte eigentlich das Observer Pattern realisieren, das mir akari empfohlen hat. Mein Code ist die leicht modifizierte Variante des ersten Beispiels aus der Wikipedia.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324181</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Thu, 12 Jul 2007 21:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to TThread bzw. TForm Klassen -&amp;gt; Vererbung mit FEhlermeldung on Thu, 12 Jul 2007 21:14:54 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Das wäre soweit auch alles richtig. Leider erlaubt der Builder für die VCL-Klassen keine Mehrfachvererbung. Das erfordert bei dir einen kleinen Umweg :</p>
<pre><code class="language-cpp">class TestForm;

class FormObserver : public Observer
{
  public :
    FormObserver(TestForm* Form);
  private : 
    TestForm* m_form;
};

FormObserver::FormObserver(TestForm* Form) : Observer(), m_Form(Form)
{
}

class TestForm : public TForm
{
  public :
    __fastcall TestForm(TObject* Owner);
  private :
    FormObserver m_observer;
};

__fastcall TestForm(TObject* Owner) : TForm(Owner), m_observer(FormObserver(this))
{
}
</code></pre>
<p>Nun kannst du in FormObserver die update-Methode aus dem Basis-Observer überschreiben und von dort an die richtige Methode aus dem Form weiterleiten.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324184</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 12 Jul 2007 21:14:54 GMT</pubDate></item><item><title><![CDATA[Reply to TThread bzw. TForm Klassen -&amp;gt; Vererbung mit FEhlermeldung on Thu, 12 Jul 2007 21:24:27 GMT]]></title><description><![CDATA[<p>Boah bist du affenartig schnell. Erstmal fettes Danke für jegliche Hilfe. Auch an Braunstein und Joe M.. Ohne Euch drei wär ich öfters aufgeschmissen.</p>
<p>So und jetzt lesen ^^</p>
<p>Und jetzt Tantchen Edit. Ok ich denke verstehe. Quasi eine Spezialisierung der Observer / Subject Klasse. Und das dann für jede VCL Klasse in der ich das nutze. Werde ich morgen früh auf Arbeit gleich mal angehen. Ich sitze jetzt seit 17 Stunden vor der Kiste. Mein Rücken bringt mich um. Wenn es läuft poste ich fertige Samples. Kann man sicher was für die Suche daraus machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324186</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Thu, 12 Jul 2007 21:24:27 GMT</pubDate></item></channel></rss>