<?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[Designproblem: Parameterübergabe]]></title><description><![CDATA[<p>Hallo,</p>
<p>Habe eine Klasse &quot;Controller&quot;, die einen &quot;upperConnector&quot;, einen &quot;lowerConnector&quot; sowie ein dazwischenliegendes &quot;Protocol&quot; verwaltet.<br />
&quot;upperConnector&quot; und &quot;lowerConnector&quot; sind vom Typ &quot;FileConnector&quot; und können konkret als &quot;COM_Connector&quot; oder &quot;TCP_Connector&quot; (beide von &quot;FileConnector&quot; abgeleitet) durch den &quot;Controller&quot; instanziiert werden. Welche Typen der &quot;Controller&quot; verwenden soll, bekommt er im Konstruktor per int-define mitgeteilt.</p>
<p>Nun benötigen sowohl TCP_Connector als auch COM_Connector jedoch noch parameter, welche ich durch eine leere Interface-Klasse &quot;Params&quot; realisiere. Von &quot;Params&quot; wird dann wiederum eine Klasse &quot;TcpParams&quot; und eine Klasse &quot;ComParams&quot; abgeleitet und dem &quot;Controller&quot;-Konstruktor ebenfalls übergeben. Hier mal der Konstruktorkopf :</p>
<pre><code>Controller::Controller(int upperFileConnector, int lowerFileConnector, int Protocol, Params upperConnectorParams, Params lowerConnectorParams)
</code></pre>
<p>Nun müsste ich natürlich im Konstruktor-Block prüfen, ob upperConnectorParams vom Typ her (&quot;Tcp- oder &quot;ComParams&quot;) zu dem unter upperFileConnector vorgegebenen &quot;FileConnector&quot; passt.<br />
mit typeid und dynamic_cast möchte ich nur ungern arbeiten.<br />
Kennt ihr eine bessere Lösung oder gibt es gar ein Pattern für diesen Fall?</p>
<p>Meine restliche Architektur finde ich recht schön OO und möchte sie nicht durch so nen blöden Aufruf verhunzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194752/designproblem-parameterübergabe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 16:37:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194752.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Oct 2007 14:31:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Wed, 10 Oct 2007 14:31:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Habe eine Klasse &quot;Controller&quot;, die einen &quot;upperConnector&quot;, einen &quot;lowerConnector&quot; sowie ein dazwischenliegendes &quot;Protocol&quot; verwaltet.<br />
&quot;upperConnector&quot; und &quot;lowerConnector&quot; sind vom Typ &quot;FileConnector&quot; und können konkret als &quot;COM_Connector&quot; oder &quot;TCP_Connector&quot; (beide von &quot;FileConnector&quot; abgeleitet) durch den &quot;Controller&quot; instanziiert werden. Welche Typen der &quot;Controller&quot; verwenden soll, bekommt er im Konstruktor per int-define mitgeteilt.</p>
<p>Nun benötigen sowohl TCP_Connector als auch COM_Connector jedoch noch parameter, welche ich durch eine leere Interface-Klasse &quot;Params&quot; realisiere. Von &quot;Params&quot; wird dann wiederum eine Klasse &quot;TcpParams&quot; und eine Klasse &quot;ComParams&quot; abgeleitet und dem &quot;Controller&quot;-Konstruktor ebenfalls übergeben. Hier mal der Konstruktorkopf :</p>
<pre><code>Controller::Controller(int upperFileConnector, int lowerFileConnector, int Protocol, Params upperConnectorParams, Params lowerConnectorParams)
</code></pre>
<p>Nun müsste ich natürlich im Konstruktor-Block prüfen, ob upperConnectorParams vom Typ her (&quot;Tcp- oder &quot;ComParams&quot;) zu dem unter upperFileConnector vorgegebenen &quot;FileConnector&quot; passt.<br />
mit typeid und dynamic_cast möchte ich nur ungern arbeiten.<br />
Kennt ihr eine bessere Lösung oder gibt es gar ein Pattern für diesen Fall?</p>
<p>Meine restliche Architektur finde ich recht schön OO und möchte sie nicht durch so nen blöden Aufruf verhunzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382156</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Wed, 10 Oct 2007 14:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Wed, 10 Oct 2007 14:37:09 GMT]]></title><description><![CDATA[<p>Ich würde andersherum angehen und die &quot;int define&quot;s nicht als eigenständigen Parameter, sondern als Teil der jeweiligen Param-Klasse übergeben - dann kann diese selber sicherstellen, daß die Angabe zu ihr &quot;passt&quot;.</p>
<p>(btw, wenn du die Param's by value übergibst, wirst du nicht viel Freude von den abgeleiteten Parameter-Klassen haben ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382163</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Oct 2007 14:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Wed, 10 Oct 2007 14:55:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich würde andersherum angehen und die &quot;int define&quot;s nicht als eigenständigen Parameter, sondern als Teil der jeweiligen Param-Klasse übergeben - dann kann diese selber sicherstellen, daß die Angabe zu ihr &quot;passt&quot;.</p>
</blockquote>
<p>Meinst du sowas wie: &quot;Params&quot; bekommt eine Membervariable int &quot;connectorTyp&quot;, in der ich den jeweiligen define stecke!? Sowas hab ich mir auch schon überlegt. dann würde also mein Konstruktor so aussehen:</p>
<pre><code>Controller::Controller(int Protocol, Params upperConnectorParams, Params lowerConnectorParams)
</code></pre>
<blockquote>
<p>(btw, wenn du die Param's by value übergibst, wirst du nicht viel Freude von den abgeleiteten Parameter-Klassen haben ;))</p>
</blockquote>
<p>Das sehe ich wohl ein ;-))</p>
<p>Aber so richtig zufrieden bin ich immer noch nicht. evtl. sollte ich meinen Controller nochmal aufteilen: in den &quot;funktionalen teil&quot;, der das Polling durch die Connectoren etc. macht und einen &quot;konstruktionalen (!?) teil&quot;, der die Instanziierung, koppelung usw. erledigt!?</p>
<p>ich werd mal drüber schlafen. Dank Dir trotzdem CStoll<br />
weitere Vorschläge sind herzlich willkommen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382176</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Wed, 10 Oct 2007 14:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Wed, 10 Oct 2007 15:01:23 GMT]]></title><description><![CDATA[<p>Noch ein anderer Ansatz: Du konstruierst erst die beiden Connectoren inklusive ihrer jeweils benötigten Parameter und übergibst dann beide an den Controler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382179</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Oct 2007 15:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 06:36:32 GMT]]></title><description><![CDATA[<p>guten Morgen,</p>
<p>ja, das war auch mein erster Ansatz. Hat auch gut funktioniert, wurde aber abgelehnt <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 />
Die Begründung war, dass der Controller ja schließlich auch kontrollieren solle und die beiden (bzw. drei, mit Protocol) Instanzen selbst erzeugen solle.</p>
<p>Ich denke ich werde den funktionalen teil des Controllers (&quot;scheduling&quot; + &quot;eventhandling&quot;) in eine neue Klasse &quot;Scheduler&quot; stecken, welche die fertig instanziierten Connectoren übergeben bekommt und den Rest der Klasse Controller so implementieren, dass sie von der main() die geparsten argumente als defines sowie die Parameter bekommt und dementsprechend die Instanziierung vornimmt.</p>
<p>Werde diese &quot;Controller&quot;-Restklasse dann wohl auch in &quot;AppLauncher&quot; umbennenen müssen, denn ein Controller lieg ja dann eigentlich nicht mehr vor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382541</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Thu, 11 Oct 2007 06:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 09:26:50 GMT]]></title><description><![CDATA[<p>Da fällt mir ein:</p>
<p>wie mache ich eigentlich eine leere (Interface) Klasse abstrakt in C++?</p>
<p>mir fällt da spontan nur private vitural methode ein:</p>
<pre><code>#ifndef _PARAMS_H_
#define _PARAMS_H_

//empty Interface Class
class Params{
	private: 
		virtual void ichtunix() = 0;
};

#endif //_PARAMS_H_
</code></pre>
<p>Seh ich das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382655</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Thu, 11 Oct 2007 09:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 09:32:39 GMT]]></title><description><![CDATA[<p>Jede Klasse hat ein paar (notfalls automatisch erzeugte) Methoden, auch wenn du nichts angibst - und im größten Notfall bietet sich ein abstrakter Destruktor an (virtuell sollte der sowieso sein, wenn du polymorph arbeiten willst):</p>
<pre><code class="language-cpp">class empty_interface
{
public:
  virtual ~empty_interface() = 0;
};

//ist notwendig trotz der abstrakt Deklaration, weil der Basis-Dtor automatisch aufgerufen wird:
empty_interface::~empty_interface()
{}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1382657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382657</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Oct 2007 09:32:39 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 09:59:54 GMT]]></title><description><![CDATA[<p>Die letzte Zeile verwirrt mich ein wenig:</p>
<p>ich will doch gerade verhindern, dass der Basis Dtor aufgerufen wird, da ja die Abgeleiteten Objekte i.d.R. mehr Speicher belegen und wieder freigeben müssen.<br />
Leider findet sich zu diesem Thema weder hier<br />
<a href="http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie#Virtuelle_Destruktoren" rel="nofollow">http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie#Virtuelle_Destruktoren</a><br />
etwas, noch in meinem Nachschlagewerk (&quot;C++ für Programmierer&quot; RRZN Uni Hanover, 11. Auflage&quot;)</p>
<p>Kannst du das ein wenig näher erleutern? was passiert, wenn ich den Dtor nicht definiere? Ich bin bisher noch nie auf die Idee gekommen eine abstr. methode zu definieren (Ableitungen natürlich ausgenommen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382697</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Thu, 11 Oct 2007 09:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 10:22:28 GMT]]></title><description><![CDATA[<p>Der Destruktor wird auf jeden Fall aufgerufen - implizit durch den Dtor der jeweiligen abgeleiteten Klasse. Daran kannst du nichts ändern.</p>
<p>Du kannst (und willst) lediglich verhindern, daß Interface-Objekte angelegt werden können - und das sichert dir der Compiler zu, wenn du der Klasse eine (egal welche) abstrakte Methode gibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382724</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Oct 2007 10:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 11:39:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Du kannst (und willst) lediglich verhindern, daß Interface-Objekte angelegt werden können - und das sichert dir der Compiler zu, wenn du der Klasse eine (egal welche) abstrakte Methode gibst.</p>
</blockquote>
<p>Das war mir soweit klar.</p>
<blockquote>
<p>Der Destruktor wird auf jeden Fall aufgerufen - implizit durch den Dtor der jeweiligen abgeleiteten Klasse. Daran kannst du nichts ändern.</p>
</blockquote>
<p>Das ist mir neu. Dachte, der basis-Dtor verhält sich so, wie der basis-Ctor. Der wird ja auch nicht implizit aufgerufen, wenn das abgeleitete Objekt instanziiert wird. Oder täusch ich mich da!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382769</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Thu, 11 Oct 2007 11:39:11 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem: Parameterübergabe on Thu, 11 Oct 2007 12:17:56 GMT]]></title><description><![CDATA[<p>wurfholz schrieb:</p>
<blockquote>
<blockquote>
<p>Der Destruktor wird auf jeden Fall aufgerufen - implizit durch den Dtor der jeweiligen abgeleiteten Klasse. Daran kannst du nichts ändern.</p>
</blockquote>
<p>Das ist mir neu. Dachte, der basis-Dtor verhält sich so, wie der basis-Ctor. Der wird ja auch nicht implizit aufgerufen, wenn das abgeleitete Objekt instanziiert wird. Oder täusch ich mich da!?</p>
</blockquote>
<p>Doch, auch der Basis-Ctor wird automatisch aufgerufen - wenn du nichts anderes in der Initialisierungsliste angibst, der Default-Ctor (d.h. der ohne Parameter).</p>
<p>(und wenn es keinen Default-Ctor in der Basisklasse gibt, macht dich der Compiler drauf aufmerksam)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382798</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Oct 2007 12:17:56 GMT</pubDate></item></channel></rss>