<?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[Implementierung von bidirektionalen Ports]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche mich etwas an UML und hab gelernt, dass Verbindungen zwischen Ports über Referenzen beim Konstruktor hergestellt werden. Also verwendet Klasse A das Interface I, welches Klasse B zur Verfügung stellt, würde ich das so machen:</p>
<pre><code>class I {};

class A {
  I&amp; myI;

  A(I&amp; i) : myI(i) {};
};

class B : public I {};

int main() {
  B myB;
  A myA(myB);
}
</code></pre>
<p>Was aber, wenn zwischen A und B eine bidirektionale Verbindung besteht, also B auch ein Interface hat, was von A bedient wird. Wenn ich B instanziiere, gibt es ja A noch nicht. Gehe ich dann auf Pointer und setze die Verbindung nachträglich?</p>
<p>Gruß,<br />
Heimchen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335220/implementierung-von-bidirektionalen-ports</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 23:42:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335220.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Nov 2015 12:49:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Fri, 06 Nov 2015 13:03:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche mich etwas an UML und hab gelernt, dass Verbindungen zwischen Ports über Referenzen beim Konstruktor hergestellt werden. Also verwendet Klasse A das Interface I, welches Klasse B zur Verfügung stellt, würde ich das so machen:</p>
<pre><code>class I {};

class A {
  I&amp; myI;

  A(I&amp; i) : myI(i) {};
};

class B : public I {};

int main() {
  B myB;
  A myA(myB);
}
</code></pre>
<p>Was aber, wenn zwischen A und B eine bidirektionale Verbindung besteht, also B auch ein Interface hat, was von A bedient wird. Wenn ich B instanziiere, gibt es ja A noch nicht. Gehe ich dann auf Pointer und setze die Verbindung nachträglich?</p>
<p>Gruß,<br />
Heimchen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474424</guid><dc:creator><![CDATA[heimchen]]></dc:creator><pubDate>Fri, 06 Nov 2015 13:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Fri, 06 Nov 2015 15:23:11 GMT]]></title><description><![CDATA[<p>Der Sinn von model-driven development ist ja, dass man zuerst mal das Design erstellt, dann den Code.</p>
<p>Wie sieht denn das UML-Diagramm dazu aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474449</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Fri, 06 Nov 2015 15:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Fri, 06 Nov 2015 15:36:35 GMT]]></title><description><![CDATA[<p>Im Übrigen sind Referenzen als Member i.d.R. keine gute Idee; Zeiger sind vorzuziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474451</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 06 Nov 2015 15:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Mon, 09 Nov 2015 11:49:43 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Der Sinn von model-driven development ist ja, dass man zuerst mal das Design erstellt, dann den Code.</p>
</blockquote>
<p>Das Modell ist fertig, jetzt muss es möglichst originalgetreu in Code überführt werden.</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Wie sieht denn das UML-Diagramm dazu aus?</p>
</blockquote>
<p>Das Diagramm zu dem Code enthält die beiden Klassen a und B und das Interface I. Von A nach I besteht eine Dependency, von B nach I besteht eine Realize Beziehung.<br />
Alternativ könnte man an A auch ein Required Interface vom Typ I malen und an B das Gegenstück.<br />
Bei dem, wozu ich den entsprechenden Code suche, kommt ein zweites Interface hinzu, welches eine Dependency von B hat und ein Realize von A.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Im Übrigen sind Referenzen als Member i.d.R. keine gute Idee; Zeiger sind vorzuziehen.</p>
</blockquote>
<p>Bisher habe ich nur die Umsetzung mit der Referenz zu den Interfaces gefunden (z.B. hier: <a href="http://www.cppbuch.de/uml.pdf" rel="nofollow">http://www.cppbuch.de/uml.pdf</a>). Zeiger werden dagegen eher für Assoiciations oder Aggregations benutzt. Macht für mich auch Sinn, schließlich muss das Interface angebunden sein (sonst wär es ein Port), während eine Association oder Aggregation ja eher lose ist - also auch NULL sein kann. Immer in C++ natürlich. Nur muss ich den Anbieter eines Interfaces dann eben schon haben, wenn ich den Nutzer Anlege...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474715</guid><dc:creator><![CDATA[heimchen]]></dc:creator><pubDate>Mon, 09 Nov 2015 11:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Mon, 09 Nov 2015 13:56:59 GMT]]></title><description><![CDATA[<p>heimchen schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Im Übrigen sind Referenzen als Member i.d.R. keine gute Idee; Zeiger sind vorzuziehen.</p>
</blockquote>
<p>Bisher habe ich nur die Umsetzung mit der Referenz zu den Interfaces gefunden (z.B. hier: <a href="http://www.cppbuch.de/uml.pdf" rel="nofollow">http://www.cppbuch.de/uml.pdf</a>). Zeiger werden dagegen eher für Assoiciations oder Aggregations benutzt.</p>
</blockquote>
<p>Es ist egal in welchem Kontext die Referenz als Member auftaucht; Ein konstanter Zeiger ist vorzuziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474740</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 09 Nov 2015 13:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Mon, 09 Nov 2015 14:02:58 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Es ist egal in welchem Kontext die Referenz als Member auftaucht; Ein konstanter Zeiger ist vorzuziehen.</p>
</blockquote>
<p>Warum? Wenn ich eine Referenz/Pointer auf z.B. einen <code>std::ostream</code> in meiner Klasse speichern möchte (ich setze mal voraus, dass das zugehörige Objekt mindestens so lange lebt wie das Objekt meiner Klasse), dann nehme ich auf jeden Fall die Referenz weil Operatorüberladung dann vernünftig funktioniert. Ich sehe keinerlei Vorteile bei der Verwendung von Pointern, wenn man kein rebind braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474743</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 09 Nov 2015 14:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Mon, 09 Nov 2015 14:33:20 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>dann nehme ich auf jeden Fall die Referenz weil Operatorüberladung dann vernünftig funktioniert.</p>
</blockquote>
<p>Was hat Operatorenüberladung damit zu tun? Der Member wird doch privat sein, demnach die Syntax unwichtig.</p>
<blockquote>
<p>Ich sehe keinerlei Vorteile bei der Verwendung von Pointern, wenn man kein rebind braucht.</p>
</blockquote>
<p>Kein Standardlayout. Keine pointer-to-member.<br />
Erzeugt z.Z. in einigen Situationen undefiniertes Verhalten (siehe CWG 1404). Dies trifft auch auf konstante Member zu, daher sollte der Zeiger natürlich nicht <code>const</code> sein, mea culpa.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474745</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 09 Nov 2015 14:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Mon, 09 Nov 2015 14:58:06 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Was hat Operatorenüberladung damit zu tun? Der Member wird doch privat sein, demnach die Syntax unwichtig.</p>
</blockquote>
<p>Nur weils private ist muss ich ja nicht die umständliche Syntax nutzen.</p>
<blockquote>
<p>Kein Standardlayout. Keine pointer-to-member.<br />
Erzeugt z.Z. in einigen Situationen undefiniertes Verhalten (siehe CWG 1404). Dies trifft auch auf konstante Member zu, daher sollte der Zeiger natürlich nicht <code>const</code> sein, mea culpa.</p>
</blockquote>
<p>OK Referenzen haben auch Nachteile. <a href="http://stackoverflow.com/questions/892133/should-i-prefer-pointers-or-references-in-member-data" rel="nofollow">Hier</a> gibts eine umfangreichere Diskussion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474748</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 09 Nov 2015 14:58:06 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 08:43:24 GMT]]></title><description><![CDATA[<p>Wenn Zeiger so viel sinnvoller sind, Frage ich mich, warum ich für diesen Fall ausschließlich Referenzen zur Implementierung gefunden hab. Auch sonst werden Referenzen in der Literatur bevorzug (als Parameter o.ä.). Dann müssten sich ja alle anderen täuschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474946</guid><dc:creator><![CDATA[heimchen]]></dc:creator><pubDate>Wed, 11 Nov 2015 08:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 10:05:23 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Was hat Operatorenüberladung damit zu tun? Der Member wird doch privat sein, demnach die Syntax unwichtig.</p>
</blockquote>
<p>Nur weils private ist muss ich ja nicht die umständliche Syntax nutzen.</p>
</blockquote>
<p>Wegen einer syntaktischen Petitesse willst du ggf. semantische Nachteile eingehen?</p>
<blockquote>
<p>Auch sonst werden Referenzen in der Literatur bevorzug (als Parameter o.ä.).</p>
</blockquote>
<p>Natürlich, als Parameter sind Referenzen hauptsächlich konzipiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474954</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Nov 2015 10:05:23 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 11:07:17 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Kein Standardlayout. Keine pointer-to-member.</p>
</blockquote>
<p>Das ist doch eh nicht gegeben:</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Der Member wird doch privat sein, demnach die Syntax unwichtig.</p>
</blockquote>
<p>wenn der Member privat ist (müssen doch schließlich alle den gleichen access haben)? Und pointer-to-member geht ja auch nicht wenn das Member privat ist.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Erzeugt z.Z. in einigen Situationen undefiniertes Verhalten (siehe CWG 1404).</p>
</blockquote>
<p>Das ist aber ein Bug der sowieso nur für Unions gilt, wenn ich das richtig verstehe (also hier auch nicht relevant)?</p>
<p>Würde mich interessieren, weil ich benutze auch ab und zu Referenzen als Member und finde das in einigen Fällen von der Modelierung her passender als Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474968</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 11 Nov 2015 11:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 13:51:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist aber ein Bug der sowieso nur für Unions gilt,</p>
</blockquote>
<p>Ja, aber er zeigt die Problematik auf, die sich hinter Referenzmembern verbirgt: Sie sind keine Objekte, müssen aber in einem &quot;dargestellt&quot; werden. Für mich scheint das einfach ein völlig falscher Anwendungsfall von Referenzen zu sein.</p>
<p>&lt;Sone&gt;Leider musste ich feststellen, dass ich ich meine Meinung dazu nur unzureichend mit technischen Argumenten belegen kann. <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="😞"
    /> &lt;/Sone&gt;</p>
<blockquote>
<p>Würde mich interessieren, weil ich benutze auch ab und zu Referenzen als Member und finde das in einigen Fällen von der Modelierung her passender als Pointer.</p>
</blockquote>
<p>Naja, wenn dir die Semantik der generierten Konstruktoren passt, usw. - i.e. wenn dir die Nuancen bewusst sind - dann ist das selbstverständlich in Ordnung. Meine Tirade war eine Mischung aus Quod licet Iovi und meinem Bauchgefühl (s.o.).</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Kein Standardlayout. Keine pointer-to-member.</p>
</blockquote>
<p>Das ist doch eh nicht gegeben:</p>
</blockquote>
<p>Ich bezog mich auf allgemeine Fälle. In diesem Fall greifen die wahrscheinlich beide nicht.</p>
<blockquote>
<p>Und pointer-to-member geht ja auch nicht wenn das Member privat ist.</p>
</blockquote>
<p>Warum nicht? Oder worauf beziehst du dich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474986</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Nov 2015 13:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 15:13:51 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Und pointer-to-member geht ja auch nicht wenn das Member privat ist.</p>
</blockquote>
<p>Warum nicht? Oder worauf beziehst du dich?</p>
</blockquote>
<p>Naja, es kann gut sein das ich grade auf dem Schlauch stehe. <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="😃"
    /> Aber:</p>
<pre><code>#include &lt;iostream&gt;

class A { int x = 42; };

int main() 
{
    int A::*ptrX = &amp;A::x; // Error: 'int A::x' is private
    std::cout &lt;&lt; A().*ptrX &lt;&lt; '\n';
}
</code></pre>
<p>geht halt nicht wenn <code>x</code> private ist wie von dir vorgeschlagen und dann ist es auch egal ob Pointer oder Referenz weil man ja eh keinen Zugriff auf <code>x</code> hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474997</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 11 Nov 2015 15:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 15:15:43 GMT]]></title><description><![CDATA[<p>Ja, aber was wenn der Memberzeiger intern erzeugt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474998</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 11 Nov 2015 15:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Wed, 11 Nov 2015 15:44:30 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ja, aber was wenn der Memberzeiger intern erzeugt wird?</p>
</blockquote>
<p>Ok, das würde dann nicht gehen. Aber die Frage wäre wofür man sowas brauchen soll?</p>
<p>Wenn ich eine Memberfunktion anbiete die mir einen Data-Memberpointer zurückgibt, dann ist dieser Datapointer ja eh schon mit der Instanz &quot;verknüpft&quot; (weil man ohne selbige ja nicht an den Pointer rankommen würde), also kann man eigentlich auch gleich einen normalen Pointer zurückgeben.</p>
<p>Gut, wenn man eine static Memberfunktion hat die einen solchen Memberzeiger zurückgeben soll, dann würde es nicht gehen... Aber wie oft und warum sollte man sowas brauchen (kann sein dass man das braucht, ist mir aber noch nie passiert)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2475003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2475003</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 11 Nov 2015 15:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung von bidirektionalen Ports on Thu, 12 Nov 2015 09:18:16 GMT]]></title><description><![CDATA[<p>Man braucht es fast nie. War auch ein sehr fadenscheiniges Argument.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2475050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2475050</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 12 Nov 2015 09:18:16 GMT</pubDate></item></channel></rss>