<?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[Signal&#x2F;Slot, public signal?]]></title><description><![CDATA[<p>Was ist eure Meinung bezüglich öffentlichem Signal (hier: value_changed)?<br />
Alternativ wäre z.B. subscribe(..) / unsubscribe(..) anzubieten (und das Signal privat machen), was sicher beim Debuggen hilfreich ist.</p>
<p>Falls mit Registrier-Methoden:<br />
- Wie benennt ihr die Methoden, falls es mehrere Signals gibt?<br />
- Wie benennt ihr die Methoden, dass die Namen nicht zu lange werden?<br />
- typedef'd ihr das signal / slot / connection?</p>
<pre><code class="language-cpp">#include &lt;boost/signals2.hpp&gt;

class node
{
public:
   node()
      : value_(0)
   { }

   boost::signals2::signal&lt;void (node&amp;)&gt; value_changed;

   long get_value() const
   {
      return value_;
   }

   void set_value(long value)
   {
      value_ = value;
      value_changed(*this);
   }

private:
   long value_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/290204/signal-slot-public-signal</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 16:04:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290204.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jul 2011 10:59:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 10:59:42 GMT]]></title><description><![CDATA[<p>Was ist eure Meinung bezüglich öffentlichem Signal (hier: value_changed)?<br />
Alternativ wäre z.B. subscribe(..) / unsubscribe(..) anzubieten (und das Signal privat machen), was sicher beim Debuggen hilfreich ist.</p>
<p>Falls mit Registrier-Methoden:<br />
- Wie benennt ihr die Methoden, falls es mehrere Signals gibt?<br />
- Wie benennt ihr die Methoden, dass die Namen nicht zu lange werden?<br />
- typedef'd ihr das signal / slot / connection?</p>
<pre><code class="language-cpp">#include &lt;boost/signals2.hpp&gt;

class node
{
public:
   node()
      : value_(0)
   { }

   boost::signals2::signal&lt;void (node&amp;)&gt; value_changed;

   long get_value() const
   {
      return value_;
   }

   void set_value(long value)
   {
      value_ = value;
      value_changed(*this);
   }

private:
   long value_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2095978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2095978</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 21 Jul 2011 10:59:42 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:01:40 GMT]]></title><description><![CDATA[<p>Niemals, niemals, niemals Member-Variablen public machen.Punkt! Selbst protected ist unverzeihlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2095982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2095982</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:14:12 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Niemals, niemals, niemals Member-Variablen public machen.Punkt! Selbst protected ist unverzeihlich.</p>
</blockquote>
<p>Stirb. Membervariablen public machen, wo es Sinn macht. Das hier ist allerdings kein Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2095997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2095997</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:22:30 GMT]]></title><description><![CDATA[<p>?</p>
<pre><code class="language-cpp">#include &lt;boost/signals2.hpp&gt;

class node
{
public:
   node()
      : value_(0)
   { }

   long get_value() const
   {
      return value_;
   }

   void set_value(long value)
   {
      value_ = value;
      value_changed_(*this);
   }

   typedef boost::signals2::signal&lt;void (node&amp;)&gt; signal_type;

   boost::signals2::connection subscribe_value_changed(signal_type::slot_type slot)
   {
      return value_changed_.connect(slot);
   }

   void unsubscribe_value_changed(boost::signals2::connection connection)
   {
      value_changed_.disconnect(connection);
   }

private:
   long value_;
   signal_type value_changed_;
};
</code></pre>
<p>[Edit]<br />
Code korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096008</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:26:45 GMT]]></title><description><![CDATA[<p>Brauchst du ein Unsubscribe überhaupt? Du kannst ja auf einem <code>connection</code> -Objekt direkt <code>disconnect()</code> aufrufen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096012</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:26:45 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:29:55 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Membervariablen public machen, wo es Sinn macht.</p>
</blockquote>
<p>Und wo wäre das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096013</guid><dc:creator><![CDATA[Markward]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:32:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Brauchst du ein Unsubscribe überhaupt? Du kannst ja auf einem <code>connection</code> -Objekt direkt <code>disconnect()</code> aufrufen...</p>
</blockquote>
<p>Habe ich mich auch gefragt. Es kommt mir irgendwie komisch vor wenns nur ein subscribe...(..) gibt. So unsymmetrisch.</p>
<p>Technisch ist das unsubscribe nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096014</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:32:50 GMT]]></title><description><![CDATA[<p>std::pair zum Beispiel. Oder Server und Port eine Socketklasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096015</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 11:40:38 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Habe ich mich auch gefragt. Es kommt mir irgendwie komisch vor wenns nur ein subscribe...(..) gibt. So unsymmetrisch.</p>
</blockquote>
<p>Bei ähnlichen Klassen bei mir habe ich meist ein <code>Connect()</code> für die Registrierung sowie ein <code>ClearConnections()</code> , um alle Slots auf einmal zu entfernen. Aber kein <code>Disconnect()</code> für einen einzelnen Slot.</p>
<p>Falls ein <code>unsubscribe()</code> keine zusätzliche Funktionalität bietet, würde ich es nicht anbieten. Sonst fragt sich der Benutzer, wieso er deine Methode aufrufen soll, wenn er den Slot mit <code>connection::disconnect()</code> ebenfalls trennen kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096021</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Jul 2011 11:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 12:04:16 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Und was hast Du wie getypedef'd?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096036</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 21 Jul 2011 12:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 13:04:42 GMT]]></title><description><![CDATA[<p>Hier mal ein Beispiel einer Timer-Klasse, die beim Ablaufen der Zeit Callbacks auslösen kann (nur der relevante Teil des APIs):</p>
<pre><code class="language-cpp">class TriggeringTimer
{
    public:
        typedef std::tr1::function&lt; void(TriggeringTimer&amp;) &gt; Listener;

    public:
        Connection    Connect(const Listener&amp; listener);
        void          ClearConnections();
};
</code></pre>
<p>Wobei die Klasse halt nur ein einzelnes Signal enthält, daher kann ich allgemeine Namen wie &quot;Listener&quot; verwenden.</p>
<p>Ein Fall, in dem ich mehrere Signale hatte: Vor einiger Zeit schrieb ein paar GUI-Klassen für SFML, allerdings entwickelte ich sie nie ganz fertig. Das sah dann z.B. folgendermassen aus: Keine <code>ClearConnections()</code> -Funktionen, und die <code>typedef</code> s sind spezifischer:</p>
<pre><code class="language-cpp">class TextField
{
    public:
        Connection     ConnectTextEvent(const TextEventListener&amp; listener);
        Connection     ConnectClick(const ClickListener&amp; listener)
};
</code></pre>
<p>Ursprünglich hatte ich Bezeichner wie <code>AddTextEventListener()</code> , aber das war mir auf Dauer zu umständlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096079</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Jul 2011 13:04:42 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 13:07:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23275">@314159265358979</a>: std::pair ist nicht das beste Beispiel für den klassischen Einsatzzweck von Objektorientierung. Die üblichen Überlegungen wie Schnittstellen-Design oder Zugriffskontrolle fallen gar nicht an, dank der Einfachheit der Datenstruktur.</p>
<p>Und</p>
<blockquote>
<p>Oder Server und Port eine Socketklasse.</p>
</blockquote>
<p>Das hat sich mir nicht erschlossen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096082</guid><dc:creator><![CDATA[Markward]]></dc:creator><pubDate>Thu, 21 Jul 2011 13:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 13:16:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096088</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 21 Jul 2011 13:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 13:30:22 GMT]]></title><description><![CDATA[<p>Markward schrieb:</p>
<blockquote>
<p>Das hat sich mir nicht erschlossen.</p>
</blockquote>
<pre><code class="language-cpp">class socket
{
public:
    const std::string server;
    const short port;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2096094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096094</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 21 Jul 2011 13:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 18:24:26 GMT]]></title><description><![CDATA[<p>Das sind keine Membervariablen, das sind Konstanten. Bäh.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096197</guid><dc:creator><![CDATA[Markward]]></dc:creator><pubDate>Thu, 21 Jul 2011 18:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 18:28:40 GMT]]></title><description><![CDATA[<p>Das sind (konstante) Membervariablen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096199</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 21 Jul 2011 18:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 18:55:12 GMT]]></title><description><![CDATA[<p>Konstante Variablen, soso. Na wenn du das so siehst <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 />
Ich persönlich halte es aber für sinnvoll, (variable!) Membervariablen grundsätzlich hinter einer Methode zu verbergen. Einschränkung dabei ist, dass die Klasse schon irgendetwas &quot;können&quot; muss. Für jeden Wert, der sich die ganze Anwendung über vermutlich nicht ändert und halt einmal im Konstruktor initialisiert wird einen Getter und Setter anzubieten ist fraglich (siehe std::pair, color_rgb o.ä.).<br />
Sobald aber ein Wert potentiell irgendwelchen implementierungsabhängigen Manipulationen unterworfen ist, sollte man den Wert nach außen auch nur durch eine Methode als saubere Schnittstelle weiterreichen. Und Datenelemente daher private machen. Ansonsten das, was Meyers sagt.<br />
Aber die Diskussion gabs hier bestimmt auch schon öfter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096210</guid><dc:creator><![CDATA[Markward]]></dc:creator><pubDate>Thu, 21 Jul 2011 18:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Thu, 21 Jul 2011 19:51:03 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Markward schrieb:</p>
<blockquote>
<p>Das hat sich mir nicht erschlossen.</p>
</blockquote>
<pre><code class="language-cpp">class socket
{
public:
    const std::string server;
    const short port;
}
</code></pre>
</blockquote>
<p>Also ich würde nichtmal sowas public machen.</p>
<p>Mal ganz davon abgesehen, dass der Name &quot;socket&quot; äusserst fraglich ist, für ein Ding das per Definition immer einen Port &quot;hat&quot; und einen Server &quot;per Namen kennt&quot;. Das riecht eher nach einer &quot;Connection&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096231</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 21 Jul 2011 19:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 12:24:42 GMT]]></title><description><![CDATA[<p>Ein Socket ist eine Eindeutige Identifizierung des Endpunkts einer Verbindung. Zu eindeutig gehört nunmal auch Host und Port.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096486</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 22 Jul 2011 12:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 12:59:18 GMT]]></title><description><![CDATA[<p>Und was ist mit Serversockets?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096504</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 22 Jul 2011 12:59:18 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 13:04:19 GMT]]></title><description><![CDATA[<p>Was soll denn ein Serversocket sein? Socket ist Socket.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096508</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 22 Jul 2011 13:04:19 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 17:10:43 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ein Socket ist eine Eindeutige Identifizierung des Endpunkts einer Verbindung. Zu eindeutig gehört nunmal auch Host und Port.</p>
</blockquote>
<p>Nein.<br />
Ein Socket ist ein Socket.<br />
Der kann auch &quot;unbound&quot; sein.</p>
<p>Was das Thema Endpunkt angeht: was soll der String &quot;server&quot; da bitte bedeuten?</p>
<p>Soll das die lokale Adresse sein auf die der Socket gebunden ist? Wieso heisst der dann &quot;server&quot; und nicht &quot;host&quot; o.ä. Und wieso als String? Du kannst einen Socket schliesslich nicht auf eine URL binden, sondern nur auf eine Adresse (bzw. auch auf mehrere, wenn man z.B. auf 0.0.0.0 bindet).</p>
<p>Davon abgesehen kann man sich die Info auf welchen Port/Adresse ein Socket gebunden ist vom System holen. Die Infos permanent in Membervariablen abzuspeichern ist also redundant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096632</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 22 Jul 2011 17:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 17:19:52 GMT]]></title><description><![CDATA[<p>Ist ein wenig OT das Thema Socket. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096635</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 22 Jul 2011 17:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 18:46:26 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der kann auch &quot;unbound&quot; sein.</p>
</blockquote>
<p>Wie du den verwendest, zeigst du mir.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Was das Thema Endpunkt angeht: was soll der String &quot;server&quot; da bitte bedeuten?</p>
<p>Soll das die lokale Adresse sein auf die der Socket gebunden ist? Wieso heisst der dann &quot;server&quot; und nicht &quot;host&quot; o.ä. Und wieso als String?</p>
</blockquote>
<p>Ich bin hier so frei und quetsche hier nen Resolver mit nem Socket in eine Klasse. Sehr komfortabel. gethostbyname() ist ja auch nur ein Aufruf, spricht für mich nichts dagegen, das dazu zu geben.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Du kannst einen Socket schliesslich nicht auf eine URL binden, sondern nur auf eine Adresse (bzw. auch auf mehrere, wenn man z.B. auf 0.0.0.0 bindet).</p>
</blockquote>
<p>Ich binde ihn auf die erste IP, auf die die URL verweist.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Davon abgesehen kann man sich die Info auf welchen Port/Adresse ein Socket gebunden ist vom System holen. Die Infos permanent in Membervariablen abzuspeichern ist also redundant.</p>
</blockquote>
<p>Mag sein. Ich weiß zwar nicht wie, aber ich glaubs dir einfach mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096670</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 22 Jul 2011 18:46:26 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 21:32:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19131">@theta</a>:<br />
Ja, ist OT <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>Zurück zum Thema:</p>
<p>Ich mache das - in meinem aktuellen Projekt - im Prinzip so wie du, mit zwei (IMO unwesentlichen) Unterschieden:</p>
<ol>
<li>Ich verwende nicht boost::signals(2) sondern was selbstgestricktes</li>
<li>Ich hab keine public Member, dafür aber nen Getter der nen shared_ptr&lt;Event&gt; zurückgibt (Event ist bei mir das, was bei signals(2) das &quot;signal&quot; ist)</li>
</ol>
<p>Ändert aber nix daran, dass man vollen Zugriff auf das &quot;signal&quot; (Event) hat.</p>
<p>Register/Unregister Funktionen führen IMO zu viel zu viel Code-Duplizierung. Einerseits muss man innerhalb der Klasse die ganzen Attach/Detach Funktionen schreiben. Andrerseits kann man auch ausserhalb der Klasse viel weniger Code wiederverwenden. Da es z.B. kein gemeinsames Interface gibt, kann man auch keine Guard-Klassen schreiben die ein Attach im Ctor und ein Detach im Dtor machen. Zu erlauben dass das &quot;signal&quot; (in dem Fall die Klasse mit den Attach/Detach Funktionen) zerstört wird, während noch Listener draufhängen, ist in der Variante auch nicht einfach.</p>
<p>In Summe sind es mir einfach zu viele Nachteile.</p>
<p>Das einzige was mich an der &quot;signal freilegen&quot; Variante stört, ist, dass man von ausserhalb der Klasse das &quot;signal&quot; triggern kann ( <code>node.value_changed();</code> ). OK, muss man halt einfach nicht machen. In grösseren Projekten, mit z.T. mässig disziplinierten Mitarbeitern, könnte das aber ein echter Nachteil sein.</p>
<p>Wenn man eine selbstgebackene Implementierung schreibt, könnte man das allerdings umgehen, indem man den Teil wo sich die &quot;Listener&quot; draufhängen können aus dem signal &quot;raustrennt&quot;.</p>
<p>Grob skizziert:</p>
<pre><code class="language-cpp">class connection_point
{
public:
    connection attach(...);
    void detach(connection c);

// ...
// vermutlich wird hier ein
    friend class event;
// angebracht sein
};

class event
{
public:
    void fire();
    connection_point&amp; get_connection_point() const;

// ...
};

class foo
{
public:
    connection_point&amp; value_changed()
    {
        return m_value_changed_event.get_connection_point();
    }

    int get_value() const { return m_value; }
    void set_value(int val)
    {
        if (val != m_value)
        {
            m_value = val;
            m_value_changed_event-&gt;fire();
        }
    }

private:
    int m_value;
    event m_value_changed_event;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2096705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096705</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 22 Jul 2011 21:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Signal&#x2F;Slot, public signal? on Fri, 22 Jul 2011 22:11:26 GMT]]></title><description><![CDATA[<p>Also <code>get_connection_point()</code> sollte entweder nicht <code>const</code> sein, oder aber eine const Referenz zurück geben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096719</guid><dc:creator><![CDATA[bmario]]></dc:creator><pubDate>Fri, 22 Jul 2011 22:11:26 GMT</pubDate></item></channel></rss>