<?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[vector mit Interface Klasse]]></title><description><![CDATA[<p>Ich möchte in SFML eine Textbasierte GUI schreiben. Meine Menu Klasse soll drei verschiedene Optionen managen, hierbei habe ich mir gedacht einen vector mit einer Basic Klasse einzufügen. Mein Problem ist das alle drei Optionen gleichzeitig im Menu vorhanden sein können. Ich habe hier mal ein kleines Beispiel geschrieben um mein Problem anschaulich darzustellen:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;memory&gt;

class A
{
public:
    virtual ~A() {}
};

class B : public A
{
public:
    B(int foo) : foo(foo) {}
protected:
    int foo;
};

class C : public B
{
public:
    C( int foo ) : B( foo ) {}
};

int main()
{
    std::vector&lt; std::unique_ptr&lt; A &gt; &gt; vec = { std::unique_ptr&lt; A &gt; ( new C(12) ), std::unique_ptr&lt; A &gt; ( new B(1) ) };

    //Wie lese ich den vector aus und finde heraus ob es C oder B ist ?
}
</code></pre>
<p>Soll ich so etwas wie typeid nutzen, um herauszufinden welche Klasse ich gerade ausgelesen habe?</p>
<p>Soll ich eine Funktion für A,B und C schreiben die mir sagt welche Klasse es ist?</p>
<p>Oder ist mein Design für meine kleine GUI einfach falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327972/vector-mit-interface-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 13:08:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327972.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Sep 2014 11:52:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 11:52:50 GMT]]></title><description><![CDATA[<p>Ich möchte in SFML eine Textbasierte GUI schreiben. Meine Menu Klasse soll drei verschiedene Optionen managen, hierbei habe ich mir gedacht einen vector mit einer Basic Klasse einzufügen. Mein Problem ist das alle drei Optionen gleichzeitig im Menu vorhanden sein können. Ich habe hier mal ein kleines Beispiel geschrieben um mein Problem anschaulich darzustellen:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;memory&gt;

class A
{
public:
    virtual ~A() {}
};

class B : public A
{
public:
    B(int foo) : foo(foo) {}
protected:
    int foo;
};

class C : public B
{
public:
    C( int foo ) : B( foo ) {}
};

int main()
{
    std::vector&lt; std::unique_ptr&lt; A &gt; &gt; vec = { std::unique_ptr&lt; A &gt; ( new C(12) ), std::unique_ptr&lt; A &gt; ( new B(1) ) };

    //Wie lese ich den vector aus und finde heraus ob es C oder B ist ?
}
</code></pre>
<p>Soll ich so etwas wie typeid nutzen, um herauszufinden welche Klasse ich gerade ausgelesen habe?</p>
<p>Soll ich eine Funktion für A,B und C schreiben die mir sagt welche Klasse es ist?</p>
<p>Oder ist mein Design für meine kleine GUI einfach falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417469</guid><dc:creator><![CDATA[cppvoid]]></dc:creator><pubDate>Sun, 14 Sep 2014 11:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 12:04:24 GMT]]></title><description><![CDATA[<p>Wenn Du wissen musst welche konkrete Klasse Du gerade aus dem vector geholt hast, dann ist Dein Klassendesign falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417470</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Sun, 14 Sep 2014 12:04:24 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:14:31 GMT]]></title><description><![CDATA[<p>MichelRT schrieb:</p>
<blockquote>
<p>Wenn Du wissen musst welche konkrete Klasse Du gerade aus dem vector geholt hast, dann ist Dein Klassendesign falsch.</p>
</blockquote>
<p>Wie kommst Du darauf? Was meinst Du wozu es** <code>dynamic_cast</code> **gibt?</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417481</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:24:43 GMT]]></title><description><![CDATA[<p>dynamic_cast gibt es eigentlich nur um dich darauf hinzuweisen das dein Klassendesign falsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417483</guid><dc:creator><![CDATA[;&amp;gt;]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:31:28 GMT]]></title><description><![CDATA[<p>;&gt; schrieb:</p>
<blockquote>
<p>dynamic_cast gibt es eigentlich nur um dich darauf hinzuweisen das dein Klassendesign falsch ist.</p>
</blockquote>
<p>Nein. Oder hast Du eine Begründung für Deine Aussage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417485</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:33:37 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>MichelRT schrieb:</p>
<blockquote>
<p>Wenn Du wissen musst welche konkrete Klasse Du gerade aus dem vector geholt hast, dann ist Dein Klassendesign falsch.</p>
</blockquote>
<p>Wie kommst Du darauf? Was meinst Du wozu es** <code>dynamic_cast</code> **gibt?</p>
<p>mfg Martin</p>
</blockquote>
<p>Dann sei auch konsequent und ermittle mit dem dynamic-cast und einer if-orgie einen enum, den den klassentyp darstellt und verzweige je mit goto zu, passenden code.<br />
Was meinste Du, wozu es goto gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417486</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:34:52 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>;&gt; schrieb:</p>
<blockquote>
<p>dynamic_cast gibt es eigentlich nur um dich darauf hinzuweisen das dein Klassendesign falsch ist.</p>
</blockquote>
<p>Nein. Oder hast Du eine Begründung für Deine Aussage?</p>
</blockquote>
<p>Er hat trotzdem recht. In Marc++us' Buch ist es ganz eindringlich beschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417487</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:34:52 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:36:54 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Dann sei auch konsequent und ermittle mit dem dynamic-cast und einer if-orgie einen enum, den den klassentyp darstellt und verzweige je mit goto zu, passenden code.<br />
Was meinste Du, wozu es goto gibt?</p>
</blockquote>
<p>Goto ist ein schlechtes Beispiel, weil es das nur aus historischen Gründen gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417488</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:39:34 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Dann sei auch konsequent und ermittle mit dem dynamic-cast und einer if-orgie einen enum, den den klassentyp darstellt und verzweige je mit goto zu, passenden code.<br />
Was meinste Du, wozu es goto gibt?</p>
</blockquote>
<p>Goto ist ein schlechtes Beispiel, weil es das nur aus historischen Gründen gibt.</p>
</blockquote>
<p>ok, dynamic_cast gibt es auch nur aus historischen Gründen. Ich hab's in den letzten 10 Jahren nicht verwendet. Man dachte halt früher, man bräuchte es.</p>
<p>goto hingegen ist vielleicht wirklich manchmal praktisch.</p>
<p>UND NU MACH DIR GEDANKEN, WAS VIRTUELLE FUNKTIONEN DIR GERADE HELFEN KÖNNEN, statt hier rumzubesserwissern. Du willst schließlich Hilfe, dann zieh auch in Erwägung, daß die Antworter recht haben könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417489</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:39:34 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:44:26 GMT]]></title><description><![CDATA[<p>in meyers mehr effektiv c++ programmieren stehen ein paar mögliche vorgehensweisen, wie man dies&amp;jenes performant und/oder wartungsarm hinkriegt, wo auch fantasieloserweise an dynamic_cast denken könnte.<br />
muttu wohl lesen, fürchte ich, dir scheint es ja um dispatcher zu gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417490</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 14:58:37 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Dann sei auch konsequent und ermittle mit dem dynamic-cast und einer if-orgie einen enum, den den klassentyp darstellt und verzweige je mit goto zu, passenden code.<br />
Was meinste Du, wozu es goto gibt?</p>
</blockquote>
<p>Goto ist ein schlechtes Beispiel, weil es das nur aus historischen Gründen gibt.</p>
</blockquote>
<p>ok, dynamic_cast gibt es auch nur aus historischen Gründen. Ich hab's in den letzten 10 Jahren nicht verwendet. Man dachte halt früher, man bräuchte es.</p>
<p>goto hingegen ist vielleicht wirklich manchmal praktisch.</p>
<p>UND NU MACH DIR GEDANKEN, WAS VIRTUELLE FUNKTIONEN DIR GERADE HELFEN KÖNNEN, statt hier rumzubesserwissern. Du willst schließlich Hilfe, dann zieh auch in Erwägung, daß die Antworter recht haben könnten.</p>
</blockquote>
<p>Wer sagt, daß ich Hilfe will? Der Fragesteller wollte Hilfe, hat er aber bis jetzt nicht wirklich bekommen. Ich nenne jetzt mal ein Beispiel:</p>
<p>Ich habe einen Klassenbaum mit vieleicht 30-40 Klassen. Manche Operationen machen aber nur mit einem Teilbaum Sinn. Der Aufrufer weiß das aber nicht:</p>
<pre><code>bool ACTION_ADD_VERSION::acceptItem( THE_ITEM *theItem )
{
	doEnterFunction(&quot;ACTION_ADD_VERSION::acceptItem&quot;);
	bool	accepted = false;

	const THE_FILE *theFile = dynamic_cast&lt;const THE_FILE *&gt;(theItem);
	if( theFile )
		accepted = theFile-&gt;canCreateVersion() &amp;&amp; ACTION_BASE::acceptItem( theItem );

	doShowLog();
	return accepted;
}
</code></pre>
<p>Ich kann hier auch nicht einfach nach einer Klassenid prüfen, denn es könnte abgeleitetete Klassen mit einer eigenen ID geben, die ich noch nicht kenne. Die Basisklasse kann das auch nicht prüfen, denn es könnte ACTIONS geben, die es noch nicht kennt.</p>
<p>Jetzt erkläre mir mal, wie man das ohne dynamic_cast lösen will.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417492</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 14:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 15:08:20 GMT]]></title><description><![CDATA[<p>Virtuelle Funktion in die Wurzel des Teilbaums.</p>
<p>mgaeckler schrieb:</p>
<blockquote>
<pre><code>bool ACTION_ADD_VERSION::acceptItem( THE_ITEM *theItem )
{
	doEnterFunction(&quot;ACTION_ADD_VERSION::acceptItem&quot;);
	bool	accepted = false;

	const THE_FILE *theFile = dynamic_cast&lt;const THE_FILE *&gt;(theItem);
	if( theFile )
		accepted = theFile-&gt;canCreateVersion() &amp;&amp; ACTION_BASE::acceptItem( theItem );

	doShowLog();
	return accepted;
}
</code></pre>
</blockquote>
<p>Völlig unklar, was das soll. Dein Code smellt nach <a href="http://en.wikipedia.org/wiki/Inner-platform_effect" rel="nofollow">http://en.wikipedia.org/wiki/Inner-platform_effect</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417494</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 15:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 16:15:12 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Ich habe einen Klassenbaum mit vieleicht 30-40 Klassen.</p>
</blockquote>
<p>Well, there's your problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417509</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 14 Sep 2014 16:15:12 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 20:57:38 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Ich habe einen Klassenbaum mit vieleicht 30-40 Klassen.</p>
</blockquote>
<p>Well, there's your problem.</p>
</blockquote>
<p>Welches Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417534</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 20:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 21:25:22 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Virtuelle Funktion in die Wurzel des Teilbaums.</p>
</blockquote>
<p>Und wie bekommst Du dann von einem Zeiger auf ein Objekt der Wurzelklasse (in diesem Fall THE_ITEM) auf einen Zeiger auf das Objekt der Wurzel des Teilbaums (THE_FILE)?</p>
<p>volkard schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<pre><code>bool ACTION_ADD_VERSION::acceptItem( THE_ITEM *theItem )
{
	doEnterFunction(&quot;ACTION_ADD_VERSION::acceptItem&quot;);
	bool	accepted = false;

	const THE_FILE *theFile = dynamic_cast&lt;const THE_FILE *&gt;(theItem);
	if( theFile )
		accepted = theFile-&gt;canCreateVersion() &amp;&amp; ACTION_BASE::acceptItem( theItem );

	doShowLog();
	return accepted;
}
</code></pre>
</blockquote>
<p>Völlig unklar, was das soll. Dein Code smellt nach <a href="http://en.wikipedia.org/wiki/Inner-platform_effect" rel="nofollow">http://en.wikipedia.org/wiki/Inner-platform_effect</a></p>
</blockquote>
<p>Designziel war, daß der Klassenbaum erweiterbar sein sollte, ohne, daß die Wurzel geändert werden muß. Das Hauptfenster kennt nur die Basisklasse (ITEM_TREE). Die verschiedenen Actionsklassen kennen dann aber die jeweiligen abgeleiteten Klassen und deren Methoden. Das Hauptfenster hat eine Liste aller Objekte der Actionklassen, kennt aber auch nur die Basisklasse (ACTION_BASE). ALLE Methoden von ACTION_BASE sind pure virtual. Das Hauptfenster ruft beim Aufbau eines Popupmenus daher einfach für jedes Actionobjekt die Methode acceptItem mit der Adresse des Itemobjektes auf und acceptItem entschiedet dann u.a. an Hand der Klasse, ob es was damit anfangen kann.</p>
<p>Kannst Du eine wartbare Version zeigen, die ohne dynamic_cast auskommt?</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417536</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 21:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 21:38:19 GMT]]></title><description><![CDATA[<p>Du hast bislang nur beschrieben, wie du es machst, nicht, was du damit erreichen willst. In der vorgelegten Form kann ich dir nur sagen, dass dein Design hoffnungslos kaputt ist, aber nicht, wodurch man es ersetzen könnte. Aber ich mach mal ein bisschen Kaffeesatzleserei.</p>
<p>Wenn es nur um den Aufbau von Popup-Menüs geht, sollte die Sache einfach zu regeln sein; immerhin braucht eine Action ja nur eine parameterlose Methode (mehr als anklicken kann man einen Eintrag nicht). Halte einen std::vector&lt;std::function&lt;void()&gt;&gt; menu_entries (oder std::pair&lt;std::string, std::function&lt;void()&gt;&gt; für eine Beschreibung, oder was auch immer du zum Rendern brauchst) und wirf da Binder rein; dann kennen die Binder den konkreten Typ des Kontextobjekts, und du musst das Zeug nicht mehr aus einem Container rauskramen, der sich die notwendigen Informationen nicht gemerkt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417539</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 14 Sep 2014 21:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 21:59:53 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Virtuelle Funktion in die Wurzel des Teilbaums.</p>
</blockquote>
<p>Und wie bekommst Du dann von einem Zeiger auf ein Objekt der Wurzelklasse (in diesem Fall THE_ITEM) auf einen Zeiger auf das Objekt der Wurzel des Teilbaums (THE_FILE)?</p>
<p>volkard schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<pre><code>bool ACTION_ADD_VERSION::acceptItem( THE_ITEM *theItem )
{
	doEnterFunction(&quot;ACTION_ADD_VERSION::acceptItem&quot;);
	bool	accepted = false;

	const THE_FILE *theFile = dynamic_cast&lt;const THE_FILE *&gt;(theItem);
	if( theFile )
		accepted = theFile-&gt;canCreateVersion() &amp;&amp; ACTION_BASE::acceptItem( theItem );

	doShowLog();
	return accepted;
}
</code></pre>
</blockquote>
<p>Völlig unklar, was das soll. Dein Code smellt nach <a href="http://en.wikipedia.org/wiki/Inner-platform_effect" rel="nofollow">http://en.wikipedia.org/wiki/Inner-platform_effect</a></p>
</blockquote>
<p>Designziel war, daß der Klassenbaum erweiterbar sein sollte, ohne, daß die Wurzel geändert werden muß. Das Hauptfenster kennt nur die Basisklasse (ITEM_TREE). Die verschiedenen Actionsklassen kennen dann aber die jeweiligen abgeleiteten Klassen und deren Methoden. Das Hauptfenster hat eine Liste aller Objekte der Actionklassen, kennt aber auch nur die Basisklasse (ACTION_BASE). ALLE Methoden von ACTION_BASE sind pure virtual. Das Hauptfenster ruft beim Aufbau eines Popupmenus daher einfach für jedes Actionobjekt die Methode acceptItem mit der Adresse des Itemobjektes auf und acceptItem entschiedet dann u.a. an Hand der Klasse, ob es was damit anfangen kann.</p>
<p>Kannst Du eine wartbare Version zeigen, die ohne dynamic_cast auskommt?</p>
<p>mfg Martin</p>
</blockquote>
<p>Schwachsinn. Da helfe ich Dir für 500€/Tag (Vorkasse) raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417540</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 21:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:02:39 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Das Hauptfenster hat eine Liste aller Objekte der Actionklassen, kennt aber auch nur die Basisklasse (ACTION_BASE). ALLE Methoden von ACTION_BASE sind pure virtual. Das Hauptfenster ruft beim Aufbau eines Popupmenus daher einfach für jedes Actionobjekt die Methode acceptItem mit der Adresse des Itemobjektes auf und acceptItem entschiedet dann u.a. an Hand der Klasse, ob es was damit anfangen kann.</p>
</blockquote>
<p>Wieso schreibst du Klassennamen komplett groß und mit Unterstrichen? Das ist ja echt hässlich.</p>
<p>Man kann u.U. schon dynamic_cast verwenden, ich schließe das nicht so kategorisch aus wie die anderen hier. Nur sollte man das wenn nur irgendwie möglich vermeiden und erst recht nicht als Teil des Designs benutzen.<br />
Man könnte z.B. eine virtuelle Methode itemClass einführen, die einen string zurückgibt und den zum matchen benutzen. Die Funktion könnte man dann vielleicht auch an anderen Stellen verwenden. Man könnte auch IDs verwenden, die irgendwann über den Klassennamen registriert werden (ich denk da an sowas wie Q_DECLARE_METATYPE).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417541</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:02:39 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:07:41 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Man könnte z.B. eine virtuelle Methode itemClass einführen, die einen string zurückgibt und den zum matchen benutzen. Die Funktion könnte man dann vielleicht auch an anderen Stellen verwenden. Man könnte auch IDs verwenden, die irgendwann über den Klassennamen registriert werden (ich denk da an sowas wie Q_DECLARE_METATYPE).</p>
</blockquote>
<p>Was willst du mit der Information anfangen, wenn du nicht casten willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417542</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:08:11 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Designziel war, daß der Klassenbaum erweiterbar sein sollte, ohne, daß die Wurzel geändert werden muß.</p>
</blockquote>
<p>Dann kannste gleich Zeiger auf void nehmen. Das Designziel würde ich zuerst überdenken.<br />
Also ein Hauptfenster kriegt Nachrichten udn verteilt sie an alle EMpfänger, die diese Nachrichtensorte verarbeiten können? Ginge auch pro Nachrichtensorte ein Slot?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417543</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:11:00 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Du hast bislang nur beschrieben, wie du es machst, nicht, was du damit erreichen willst. In der vorgelegten Form kann ich dir nur sagen, dass dein Design hoffnungslos kaputt ist, aber nicht, wodurch man es ersetzen könnte. Aber ich mach mal ein bisschen Kaffeesatzleserei.</p>
<p>Wenn es nur um den Aufbau von Popup-Menüs geht, sollte die Sache einfach zu regeln sein; immerhin braucht eine Action ja nur eine parameterlose Methode (mehr als anklicken kann man einen Eintrag nicht). Halte einen std::vector&lt;std::function&lt;void()&gt;&gt; menu_entries (oder std::pair&lt;std::string, std::function&lt;void()&gt;&gt; für eine Beschreibung, oder was auch immer du zum Rendern brauchst) und wirf da Binder rein; dann kennen die Binder den konkreten Typ des Kontextobjekts, und du musst das Zeug nicht mehr aus einem Container rauskramen, der sich die notwendigen Informationen nicht gemerkt hat.</p>
</blockquote>
<p>Ja ganz so einfach ist es aber nicht. Grundsätzlich habe ich ja so eine Liste. Es muß aber einen Weg geben, mit dem entschieden werden kann, ob jetzt eine konkretet Funktion mit dem konkreten Objekt überhaupt möglich ist. In dem Container könnten verschiedene Objekte enthalten sein. Jedes dieser Objekte kann, muß aber nicht, eigene Einträge in dem Popupmenu enthalten, es könnte sogar möglich sein, daß ein Objekt einen Popupeintrag erhält, von dem es sogar selbst keine Ahnung hat. Das Hauptfenster hat daher einfach eine Liste aller überhaupt möglichen Einträge des Popupmenüs.<br />
So wird die Liste der Einträge eines Popupmenüs aufgebaut:</p>
<pre><code>void getItemActions(
	const USER_OR_GROUP *actUser,
	THE_ITEM *theItem,
	Array&lt;ACTION_BASE *&gt; *actions
)
{
	actions-&gt;clear();

	for( size_t i=0; i&lt;allActions-&gt;getNumElements(); i++ )
	{
		ACTION_BASE *theAction = (*allActions)[i];

		if( theAction-&gt;acceptUser( actUser )
		&amp;&amp; theAction-&gt;acceptItem( theItem ) )
			actions-&gt;addElement( theAction );
	}

	actions-&gt;sort( actionCompare );
}
</code></pre>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417544</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:11:00 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:16:18 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Ja ganz so einfach ist es aber nicht. Grundsätzlich habe ich ja so eine Liste. Es muß aber einen Weg geben, mit dem entschieden werden kann, ob jetzt eine konkretet Funktion mit dem konkreten Objekt überhaupt möglich ist.</p>
</blockquote>
<p>Aber muss die Funktion das wissen? Kann das Objekt nicht die Entscheidung treffen, ob es mit der Funktion spielen mag?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417545</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:23:18 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Schwachsinn. Da helfe ich Dir für 500€/Tag (Vorkasse) raus.</p>
</blockquote>
<p>Nein danke, Deine Qualifikation reicht dafür leider nicht aus. Nachdem Du hier wohl auch eine Moderatorenrolle übernommen hast, solltest Du vielleicht wenigstens diesen Artikel lesen: <a href="http://de.wikipedia.org/wiki/Moderation_%28Gruppenarbeit%29" rel="nofollow">http://de.wikipedia.org/wiki/Moderation_(Gruppenarbeit)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417546</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:34:50 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Schwachsinn. Da helfe ich Dir für 500€/Tag (Vorkasse) raus.</p>
</blockquote>
<p>Nein danke, Deine Qualifikation reicht dafür leider nicht aus. Nachdem Du hier wohl auch eine Moderatorenrolle übernommen hast, solltest Du vielleicht wenigstens diesen Artikel lesen: <a href="http://de.wikipedia.org/wiki/Moderation_%28Gruppenarbeit%29" rel="nofollow">http://de.wikipedia.org/wiki/Moderation_(Gruppenarbeit)</a></p>
</blockquote>
<p>Bisher war mein Beitrag hier nicht in der Rolle als Mod.</p>
<p>Aber da Du Wert drauf legst, lese ich mal nach.<br />
<a href="http://de.wikipedia.org/wiki/Moderator_%28Beruf%29#Moderator_.28Internet.29" rel="nofollow">http://de.wikipedia.org/wiki/Moderator_(Beruf)#Moderator_.28Internet.29</a></p>
<p>Ok, unerwünscht.<br />
Laß das Trollen mit Deinem vermurksten Code und den daraus abgeleiteten Schlussfolgerungen. Du bringst den Neulingen damit Mist bei und senkst die Qualität des Forums. Weitere Beiträge dahingehend werde ich löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417548</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 22:40:24 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Wieso schreibst du Klassennamen komplett groß und mit Unterstrichen? Das ist ja echt hässlich.</p>
</blockquote>
<p>Hab ich mir mal so angewöhnt. Gefällt mir aber auch nicht mehr. Neuere Klassen bekommen jetzt einen schönderen Namen.</p>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Man kann u.U. schon dynamic_cast verwenden, ich schließe das nicht so kategorisch aus wie die anderen hier. Nur sollte man das wenn nur irgendwie möglich vermeiden und erst recht nicht als Teil des Designs benutzen.</p>
</blockquote>
<p>Dynamic casts sind noch teurer wie virtuelle Funktionen, daher sind sie nur dann anzuwenden, wenn es erforderlich ist.</p>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Man könnte z.B. eine virtuelle Methode itemClass einführen, die einen string zurückgibt und den zum matchen benutzen. Die Funktion könnte man dann vielleicht auch an anderen Stellen verwenden. Man könnte auch IDs verwenden, die irgendwann über den Klassennamen registriert werden (ich denk da an sowas wie Q_DECLARE_METATYPE).</p>
</blockquote>
<p>Daran habe ich auch schon gedacht, ist aber nicht besser, wie dynamic_cast. Das Problem dabei nämlich ist, wenn der Entwickler hier irgendein Fehler macht, merkt er das erst zur Laufeit und muß u.U. aufwendig mit 'nen Debugger suchen. Nach 'nen dynamic cast muß ich nur prüfen, ob ich NULL zurückbekommen habe, was wesentlich einfacher ist. Beispiel:</p>
<p>Ich habe eine Klasse THE_FOLDER, die keine verschiedenen Versionen haben kann. Hätte ich in meinem ursprünglichen Beispiel versehentlioch statt 'nen dynamic_cast auf THE_FILE einen auf THE_FOLDER gemacht, hätte sich spätestens beim Versuch canCreateVersion von THE_FOLDER der Compiler beschwert. Würde ich stattdessen einen Pattern-vergleich oder ID-Vergleich oder was auch immer machen und den Zeiger mit 'nem static_cast in die richtige Form bringen, um canCreateVersion aufrufen zu können. dann würde es irgendwanneinmal zur Laufzeit krachen. Ich kann mir nicht vorstellen, daß einer von Euch das besser findet.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417549</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 22:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to vector mit Interface Klasse on Sun, 14 Sep 2014 23:35:28 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Ja ganz so einfach ist es aber nicht. Grundsätzlich habe ich ja so eine Liste. Es muß aber einen Weg geben, mit dem entschieden werden kann, ob jetzt eine konkretet Funktion mit dem konkreten Objekt überhaupt möglich ist.</p>
</blockquote>
<p>Aber muss die Funktion das wissen? Kann das Objekt nicht die Entscheidung treffen, ob es mit der Funktion spielen mag?</p>
</blockquote>
<p>Dazu muß das Objekt aber die Funktion kennen. Das ist aber nicht gewährleistet.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417550</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 14 Sep 2014 23:35:28 GMT</pubDate></item></channel></rss>