<?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[Zuständigkeitsketten&#x2F;vererbungsproblem]]></title><description><![CDATA[<p>hi<br />
Ich habe mich ein wenig mit Design Patterns auseinandergesetzt und bin über &quot;Zuständigkeitsketten&quot; gestolpert(habe leider noch kein Buch zum Thema). Nun schrieb ich ein kleines Programm zur Übung, hänge aber leider fest <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="🙂"
    /><br />
Hier mein Programm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;string&gt;

class obj
{
	public:
		obj() {}
		virtual ~obj() {}
		virtual std::string query( std::string ) /*= 0*/;	// pure virtuelle Funktionen ergeben einen Fehler
		virtual std::string getQuery() /* = 0 */;
	protected:
		std::string res_return;
};

class A : public obj
{
	public:
		A() : i(0) {}
		int i;
		std::string query( std::string q )
		{
			res_return = &quot;Klasse A&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};

class B : public obj
{
	public:
		B() : j(0) {}
		int j;
		std::string query( std::string q )
		{
			res_return = &quot;Klasse B&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};
</code></pre>
<p>Zwei KLassen also( A und B ) die von obj erben( somit ist obj eine Schnittstelle für die beiden Klassen ). Soweit so gut. Nun der Bearbeiter der vor die Klassen gesetzt ist und die Befehle an alle Klassen durchgeben soll:</p>
<pre><code class="language-cpp">class ChainOfResponsibility
{
	public:
		ChainOfResponsibility( obj*, obj* );
		~ChainOfResponsibility() {}
		bool request( std::string );
	private:
		std::list&lt;obj&gt; *chain  // hier bin ich mir unsicher, std::list&lt;obj*&gt; funktioniert nicht
		std::list&lt;obj&gt;::iterator iter;
};

ChainOfResponsibility::ChainOfResponsibility( obj* ObjA, obj* ObjB)
{
	chain-&gt;push_back( *ObjA );
	chain-&gt;push_back( *ObjB );
}

bool ChainOfResponsibility::request( std::string test )
{
	for( iter = chain-&gt;begin(); iter != chain-&gt;end(); iter++ )
	{
		iter-&gt;query( &quot;bla&quot; );
		if( iter-&gt;getQuery() == test ) return true;
	}
	return false;
}
</code></pre>
<p>Und schließlich die main:</p>
<pre><code class="language-cpp">int main()
{
	A *a;
	B *b;
	ChainOfResponsibility Ch( a, b );
	if( Ch.request( &quot;Klasse B&quot; ) )
        std::cout &lt;&lt; &quot;\&quot;Klasse B\&quot; wurde gefunden&quot; &lt;&lt; std::endl;
	else std::cout &lt;&lt; &quot;\&quot;Klasse B\&quot; konnte nicht gefunden werden&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Fehler:</p>
<pre><code>$ g++ TESTAPP.cpp -o TESTAPP
/tmp/ccLcTqOo.o: In function `obj::obj(obj const&amp;)':
TESTAPP.cpp:(.text._ZN3objC1ERKS_[obj::obj(obj const&amp;)]+0x7): undefined reference to `vtable for obj'
collect2: ld returned 1 exit status
</code></pre>
<p>Leider versteh ich die Fehlermeldung nicht so ganz, muss wohl irgendwas mit der list oder der abstrakten Klasse obj zu tun haben, oder? Hat jemand eine bessere Lösung für mich oder gibts irgendwo einen Beispielcode dazu denn Google und die suchfunktion haben mich nicht wirklich weitergebracht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222093/zuständigkeitsketten-vererbungsproblem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 09:50:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222093.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Sep 2008 18:33:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 18:33:09 GMT]]></title><description><![CDATA[<p>hi<br />
Ich habe mich ein wenig mit Design Patterns auseinandergesetzt und bin über &quot;Zuständigkeitsketten&quot; gestolpert(habe leider noch kein Buch zum Thema). Nun schrieb ich ein kleines Programm zur Übung, hänge aber leider fest <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="🙂"
    /><br />
Hier mein Programm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;string&gt;

class obj
{
	public:
		obj() {}
		virtual ~obj() {}
		virtual std::string query( std::string ) /*= 0*/;	// pure virtuelle Funktionen ergeben einen Fehler
		virtual std::string getQuery() /* = 0 */;
	protected:
		std::string res_return;
};

class A : public obj
{
	public:
		A() : i(0) {}
		int i;
		std::string query( std::string q )
		{
			res_return = &quot;Klasse A&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};

class B : public obj
{
	public:
		B() : j(0) {}
		int j;
		std::string query( std::string q )
		{
			res_return = &quot;Klasse B&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};
</code></pre>
<p>Zwei KLassen also( A und B ) die von obj erben( somit ist obj eine Schnittstelle für die beiden Klassen ). Soweit so gut. Nun der Bearbeiter der vor die Klassen gesetzt ist und die Befehle an alle Klassen durchgeben soll:</p>
<pre><code class="language-cpp">class ChainOfResponsibility
{
	public:
		ChainOfResponsibility( obj*, obj* );
		~ChainOfResponsibility() {}
		bool request( std::string );
	private:
		std::list&lt;obj&gt; *chain  // hier bin ich mir unsicher, std::list&lt;obj*&gt; funktioniert nicht
		std::list&lt;obj&gt;::iterator iter;
};

ChainOfResponsibility::ChainOfResponsibility( obj* ObjA, obj* ObjB)
{
	chain-&gt;push_back( *ObjA );
	chain-&gt;push_back( *ObjB );
}

bool ChainOfResponsibility::request( std::string test )
{
	for( iter = chain-&gt;begin(); iter != chain-&gt;end(); iter++ )
	{
		iter-&gt;query( &quot;bla&quot; );
		if( iter-&gt;getQuery() == test ) return true;
	}
	return false;
}
</code></pre>
<p>Und schließlich die main:</p>
<pre><code class="language-cpp">int main()
{
	A *a;
	B *b;
	ChainOfResponsibility Ch( a, b );
	if( Ch.request( &quot;Klasse B&quot; ) )
        std::cout &lt;&lt; &quot;\&quot;Klasse B\&quot; wurde gefunden&quot; &lt;&lt; std::endl;
	else std::cout &lt;&lt; &quot;\&quot;Klasse B\&quot; konnte nicht gefunden werden&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Fehler:</p>
<pre><code>$ g++ TESTAPP.cpp -o TESTAPP
/tmp/ccLcTqOo.o: In function `obj::obj(obj const&amp;)':
TESTAPP.cpp:(.text._ZN3objC1ERKS_[obj::obj(obj const&amp;)]+0x7): undefined reference to `vtable for obj'
collect2: ld returned 1 exit status
</code></pre>
<p>Leider versteh ich die Fehlermeldung nicht so ganz, muss wohl irgendwas mit der list oder der abstrakten Klasse obj zu tun haben, oder? Hat jemand eine bessere Lösung für mich oder gibts irgendwo einen Beispielcode dazu denn Google und die suchfunktion haben mich nicht wirklich weitergebracht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578206</guid><dc:creator><![CDATA[Auma]]></dc:creator><pubDate>Sun, 07 Sep 2008 18:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 18:57:49 GMT]]></title><description><![CDATA[<p>Auma schrieb:</p>
<blockquote>
<p>Ich habe mich ein wenig mit Design Patterns auseinandergesetzt und bin über &quot;Zuständigkeitsketten&quot; gestolpert...</p>
</blockquote>
<p>Das soll jetzt nicht böse gemeint sein: Aber du solltest vielleicht noch einmal ein wenig mehr über die C++ Grundlagen stolpern...</p>
<p>Auma schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
virtual std::string query( std::string ) /*= 0*/;	// pure virtuelle Funktionen ergeben einen Fehler
...
</code></pre>
</blockquote>
<p>Nein! Pure virtuelle Methoden ergeben <strong>keinen</strong> Fehler. Zumindestens wenn man die Regeln der Polymorphie unter C++ richtig anwendet, und die Klasse als abstrakte Basisklasse dienen soll. Hier hättest du imho schon ein wenig nachforschen müssen, warum es in deinem Programm zu Fehlern kommt.</p>
<p>Grundlegend: Polymorphie funktioniert nur mit Zeigern oder Referenzen! (Falls du von Sprachen wie Java/C# kommst: In anderen Sprachen wie Java und C# sieht man davon nichts, da dort die Zeiger verborgen sind, und deren Referenzen den C++ Zeigern entsprechen).</p>
<p>Ich habe an dieser Stelle noch zwei Anmerkungen:<br />
a) Soll query wirklich eine Kopie des Strings übergeben bekommen, oder reicht nicht auch eine konstante Referenz (Thema: Vermeidung unnötiger Kopien). Diese Frage sollte man sich bei allen nicht-integralen Datentypen stellen...<br />
b) Variablennamen und Bezeichner sollte man immer Sprechend wählen, zudem würde ich sie im Header immer hinschreiben, als Übersicht ist der Header besser als die Sourcedatei geeignet.</p>
<p>Auma schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
std::list&lt;obj&gt; *chain  // hier bin ich mir unsicher, std::list&lt;obj*&gt; funktioniert nicht
...
</code></pre>
</blockquote>
<p>Ähmm... std::list&lt;obj*&gt; funktioniert sicherlich, und es ist eher fraglich warum du die Liste als Zeiger halten willst. Davon abgesehen hält man in der Regel aus guten Gründen keine Iteratoren langfristig. Dies man zwar in einer Liste meist noch gehen, aber ich hoffe du weist das Iteratoren je nach Container zwischenzeitlich ungültig werden können...</p>
<p>Schau dir lieber mal an wo deine Fehler bei &quot;std::list&lt;obj*&gt;&quot; und den pure virtuellen Methoden liegen. std::list&lt;obj&gt; kann nicht klappen, da du dort nur Elemente der Basisklasse halten kannst (Und den restlichen Teil der abgeleiteten Klasse abschneidest).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578218</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 07 Sep 2008 18:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 19:28:01 GMT]]></title><description><![CDATA[<p>ok, vielen dank erst einmal für die konstruktive Kritik <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>asc schrieb:</p>
<blockquote>
<p>Nein! Pure virtuelle Methoden ergeben keinen Fehler. Zumindestens wenn man die Regeln der Polymorphie unter C++ richtig anwendet, und die Klasse als abstrakte Basisklasse dienen soll. Hier hättest du imho schon ein wenig nachforschen müssen, warum es in deinem Programm zu Fehlern kommt.</p>
</blockquote>
<p>Ja da hast du recht, ich hatte wahrscheinlich eine Fehlermeldung fals gedeutet, danke dafür.</p>
<p>asc schrieb:</p>
<blockquote>
<p>Ähmm... std::list&lt;obj*&gt; funktioniert sicherlich, und es ist eher fraglich warum du die Liste als Zeiger halten willst.</p>
</blockquote>
<p>Du hast recht in einem vorherigen vcersuch schrieb ich ausversehen <code>std::list&lt;*obj&gt;</code> , jetzt gehts <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>asc schrieb:</p>
<blockquote>
<p>Davon abgesehen hält man in der Regel aus guten Gründen keine Iteratoren langfristig. Dies man zwar in einer Liste meist noch gehen, aber ich hoffe du weist das Iteratoren je nach Container zwischenzeitlich ungültig werden können...</p>
</blockquote>
<p>ok, danke für den hinweis, das hab ich noch nicht gewusst <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>Ich hab einmal versucht alles so zu übernehmen, eine Fehlermeldung bekomme ich noch immer</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;string&gt;

class obj
{
	public:
		obj() {}
		virtual ~obj() {}
		virtual std::string query( std::string&amp; ) = 0;
		virtual std::string getQuery() = 0;
	protected:
		std::string res_return;
};

class A : public obj
{
	public:
		A() : i(0) {}
		int i;
		std::string query( std::string&amp; q )
		{
			res_return = &quot;Klasse A&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};

class B : public obj
{
	public:
		B() : j(0) {}
		int j;
		std::string query( std::string&amp; q )
		{
			res_return = &quot;Klasse B&quot;;
			return res_return;
		}
		std::string getQuery() { return res_return; }
};

class ChainOfResponsibility
{
	public:
		ChainOfResponsibility( obj*, obj* );
		~ChainOfResponsibility() {}
		bool request( std::string&amp; );
	private:
		std::list&lt;obj*&gt; chain;
};

ChainOfResponsibility::ChainOfResponsibility( obj* ObjA, obj* ObjB)
{
	chain.push_back( ObjA );
	chain.push_back( ObjB );
}

bool ChainOfResponsibility::request( std::string&amp; test )
{
	std::list&lt;obj*&gt;::iterator iter;
	for( iter = chain.begin(); iter != chain.end(); iter++ )
	{
		iter.query( &quot;bla&quot; );
		if( iter.getQuery() == test ) return true;
	}
	return false;
}

int main()
{
	A *a;
	B *b;
	ChainOfResponsibility Ch( a, b );
	std::string r( &quot;Klasse b&quot; );
	if( Ch.request( r ) )
		std::cout &lt;&lt; &quot;Klasse B wurde gefunden&quot; &lt;&lt; std::endl;
	else std::cout &lt;&lt; &quot;Klasse B konnte nicht gefunden werden&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Fehler:</p>
<pre><code>g++ TESTAPP.cpp -o TESTAPP
TESTAPP.cpp: In member function ‘bool ChainOfResponsibility::request(std::string&amp;)’:
TESTAPP.cpp:63: error: ‘struct std::_List_iterator&lt;obj*&gt;’ has no member named ‘query’
TESTAPP.cpp:64: error: ‘struct std::_List_iterator&lt;obj*&gt;’ has no member named ‘getQuery’
</code></pre>
<p>hier ist also der fehler, oder?:</p>
<pre><code class="language-cpp">iter.query( &quot;bla&quot; );
		if( iter.getQuery() == test ) return true;
</code></pre>
<p>ich habs mal so prtobiert, brachte aber nichts:</p>
<pre><code class="language-cpp">iter.*query( &quot;bla&quot; );
		if( iter.*getQuery() == test ) return true;
</code></pre>
<p>wie kann ich per iterator auf die query Funktion zugreifen?<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578237</guid><dc:creator><![CDATA[Auma]]></dc:creator><pubDate>Sun, 07 Sep 2008 19:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 19:34:16 GMT]]></title><description><![CDATA[<p>Habe jetzt nicht alles gelesen, aber Iteratoren unterstzützen normalerweise den *-Operator:</p>
<pre><code class="language-cpp">(*iter).query
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1578240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578240</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Sep 2008 19:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 19:35:48 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Habe jetzt nicht alles gelesen, aber Iteratoren unterstzützen normalerweise den *-Operator:</p>
<pre><code class="language-cpp">(*iter).query
</code></pre>
</blockquote>
<p>wie waere es mit</p>
<pre><code class="language-cpp">iter-&gt;query
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578242</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 07 Sep 2008 19:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 19:42:04 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Habe jetzt nicht alles gelesen, aber Iteratoren unterstzützen normalerweise den *-Operator:</p>
<pre><code class="language-cpp">(*iter).query
</code></pre>
</blockquote>
<p>wie waere es mit</p>
<pre><code class="language-cpp">iter-&gt;query
</code></pre>
<p>?</p>
</blockquote>
<p>Jo, wollte ich auch noch schreiben, musste aber gerade weg. <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/1578246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578246</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Sep 2008 19:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 19:43:54 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>wie waere es mit</p>
<pre><code class="language-cpp">iter-&gt;query
</code></pre>
<p>?</p>
</blockquote>
<p>habs versucht:</p>
<pre><code class="language-cpp">bool ChainOfResponsibility::request( std::string&amp; test )
{
	std::list&lt;obj*&gt;::iterator iter;
	for( iter = chain.begin(); iter != chain.end(); iter++ )
	{
		iter-&gt;query( &quot;bla&quot; );
		if( iter-&gt;getQuery() == test ) return true;
	}
	return false;
}
</code></pre>
<p>Fehler:</p>
<pre><code>g++ TESTAPP.cpp -o TESTAPP
TESTAPP.cpp: In member function ‘bool ChainOfResponsibility::request(std::string&amp;)’:
TESTAPP.cpp:63: error: request for member ‘query’ in ‘* iter.std::_List_iterator&lt;_Tp&gt;::operator-&gt; [with _Tp = obj*]()’, which is of non-class type ‘obj*’
TESTAPP.cpp:64: error: request for member ‘getQuery’ in ‘* iter.std::_List_iterator&lt;_Tp&gt;::operator-&gt; [with _Tp = obj*]()’, which is of non-class type ‘obj*’
</code></pre>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578248</guid><dc:creator><![CDATA[Auma]]></dc:creator><pubDate>Sun, 07 Sep 2008 19:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 21:24:53 GMT]]></title><description><![CDATA[<p><code>iter</code> zeigt ja selbst auf einen Zeiger. Du musst den Iterator also zweimal dereferenzieren:</p>
<pre><code class="language-cpp">(*iter)-&gt;query
</code></pre>
<p>oder:</p>
<pre><code class="language-cpp">(**iter).query
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1578288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578288</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Sep 2008 21:24:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 21:27:42 GMT]]></title><description><![CDATA[<p>Auma schrieb:</p>
<blockquote>
<p>...habs versucht:</p>
<pre><code class="language-cpp">...
{
	std::list&lt;obj*&gt;::iterator iter;
...
</code></pre>
</blockquote>
<p>Naja, kleiner Denkfehler von Dir:</p>
<ul>
<li>ein Iterator <em>zeigt</em> auf ein Listenelement. Deswegen kann man mit '-&gt;' bzw. '*' auf ein Listenelement zugreifen.</li>
<li>in Deiner Liste verwaltest Du aber <em>Zeiger</em> auf Objekte. Willst Du also von einem Listenelement auf das dahinterliegende Objekt zugreifen, brauchst Du wiederum '-&gt;' bzw. '*'</li>
</ul>
<p>Ein Hinwis darauf findet sich tatsächlich in der Fehlermeldung:</p>
<p>Auma schrieb:</p>
<blockquote>
<p>...</p>
<pre><code>...List_iterator&lt;_Tp&gt;::operator-&gt; [with _Tp = obj*]()’, which is of non-class type ‘obj*’...
</code></pre>
<p>...</p>
</blockquote>
<p>Hier brauchst Du also:</p>
<pre><code class="language-cpp">(*iter)-&gt;query
// iter = &quot;Zeiger auf ein Listenelement&quot;
// (*iter) = Listenelement = obj*
// (*iter)-&gt; = obj
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578289</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 07 Sep 2008 21:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 21:39:07 GMT]]></title><description><![CDATA[<p>ja <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> vielen dank jetzt Kompiliert es... leider kommt es zu einem Segmentation fault <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich lass das ganze mal durch nen Debugger laufen <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="🙂"
    /> ...<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578295</guid><dc:creator><![CDATA[Auma]]></dc:creator><pubDate>Sun, 07 Sep 2008 21:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Sun, 07 Sep 2008 21:51:02 GMT]]></title><description><![CDATA[<p>Auma schrieb:</p>
<blockquote>
<p>Ich lass das ganze mal durch nen Debugger laufen <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="🙂"
    /> ...<br />
mfg</p>
</blockquote>
<p><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>
<p>Gute Entscheidung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578298</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Sep 2008 21:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Mon, 08 Sep 2008 07:18:02 GMT]]></title><description><![CDATA[<p>Auma schrieb:</p>
<blockquote>
<p>ja <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> vielen dank jetzt Kompiliert es... leider kommt es zu einem Segmentation fault <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich lass das ganze mal durch nen Debugger laufen <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="🙂"
    /> ...<br />
mfg</p>
</blockquote>
<p>Dir ist hoffentlich der Fehler an dieser Stelle klar:</p>
<pre><code class="language-cpp">ChainOfResponsibility::ChainOfResponsibility( obj* ObjA, obj* ObjB)
{
    chain.push_back( ObjA );
    chain.push_back( ObjB );
}

int main()
{
    A *a; // 1.
    B *b; // 1.
    ChainOfResponsibility Ch( a, b ); // 2.
    //...
}
</code></pre>
<p>Ansonsten: Zurück zu den Grundlagen...</p>
<p>1. Uninitialisierte Zeiger sind böse<br />
2. Du kannst doch nicht erwarten das eben diese Zeiger in deiner Liste Sinn machen.</p>
<p>Davon ganz abgesehen solltest du Tips immer ganz oder garnicht beherzigen:</p>
<pre><code class="language-cpp">virtual std::string query( std::string&amp; ) = 0;
</code></pre>
<p>Soll query den Übergabestring ändern können? Wenn nein, bitte eine konstante Referenz verwenden (Schreibweise: &quot;std::string const &amp;&quot; oder &quot;const std::string &amp;&quot;).</p>
<p>Zudem trennt man Code in Deklaration und Definition (Header/Source) und es ist - ich wiederhole nochmal - eine Unsitte im Header die Bezeichner wegzulassen. Stell dir vor du schaust dir deinen Code nach einen halben Jahr nochmal an. Möchtest du für einen Kurzen Überblick wirklich genötigt werden die Implementierung durchzuarbeiten? Man sollte immer gegen die Schnittstelle (Header), nicht gegen die Implementierung programmieren, und daher sollte für das Verständnis der Header ausschlaggebend sein.</p>
<pre><code class="language-cpp">class ChainOfResponsibility
{
    //...
    bool request( std::string&amp; );
    //...
}
</code></pre>
<p>Was soll diese Methode uns sagen? Ich kann daraus nur ablesen das irgendetwas angefordert wird. Der Bezeichner (da fehlend) gibt nichts her, und auch der Methodenname alleine hilft nicht dabei den Aufruf zu verstehen. Was ich noch ablesen kann ist, das die Methode einen String als Argument erhält, und dieser innerhalb der Methode manipuliert wird (Ansonsten würde ja eine konstante Referenz verwendet werden).</p>
<p>Programme sollten so geschrieben werden das sie möglichst selbsterklärend sind. Wenn du deinen Code nach einen halben Jahr nochmal üerfliegst weißt du wovon ich spreche...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578395</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 08 Sep 2008 07:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Mon, 08 Sep 2008 13:21:37 GMT]]></title><description><![CDATA[<p>ja, danke es funktioniert.</p>
<p>asc schrieb:</p>
<blockquote>
<p>Uninitialisierte Zeiger sind böse</p>
</blockquote>
<p>keine Ahnung warum ich das übersehen hab <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>asc schrieb:</p>
<blockquote>
<p>[...]bitte eine konstante Referenz verwenden[...]</p>
</blockquote>
<p>das Programm schrieb ich ja nur um das Prinzip besser zu verstehen, aber du hast recht wenn dann richtig <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="🙂"
    /><br />
Die Bezeichner spielen somit auch keine Rolle, ich werde das Programm/den Code sicher nicht lange aufbewahren.<br />
mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578632</guid><dc:creator><![CDATA[Auma]]></dc:creator><pubDate>Mon, 08 Sep 2008 13:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zuständigkeitsketten&#x2F;vererbungsproblem on Mon, 08 Sep 2008 13:37:45 GMT]]></title><description><![CDATA[<p>Auma schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>[...]bitte eine konstante Referenz verwenden[...]</p>
</blockquote>
<p>das Programm schrieb ich ja nur um das Prinzip besser zu verstehen, aber du hast recht wenn dann richtig <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="🙂"
    /><br />
Die Bezeichner spielen somit auch keine Rolle, ich werde das Programm/den Code sicher nicht lange aufbewahren.</p>
</blockquote>
<p>Der Mensch ist ein Gewohnheitstier. Wenn du dir den Stil früh angewöhnst, wird du ihn auch durchziehen wenn du es wirklich benötigst. Zudem mag das Projekt ein &quot;Wegwerfprojekt&quot; sein, für die anderen Threadleser helfen Bezeichner aber durchaus weiter, selbst wenn du diese nicht benötigst ;)...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578642</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 08 Sep 2008 13:37:45 GMT</pubDate></item></channel></rss>