<?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[designfrage zu schnittstellenklasse und implementierung]]></title><description><![CDATA[<p>gute morgen leute</p>
<p>ausgangspunkt ist folgende klasse:</p>
<pre><code>class auth_params
{
   public:
      auto account(void) const noexcept -&gt; const std::string&amp;;
      auto username(void) const noexcept -&gt; const std::string&amp;;
      auto password(void) const noexcept -&gt; const std::string&amp;;
      auto session_token(void) const noexcept -&gt; const std::string&amp;;
      auto api_key(void) const noexcept -&gt; const std::string&amp;;
      auto account(const std::string &amp;str) -&gt; auth_params&amp;;
      auto username(const std::string &amp;str) -&gt; auth_params&amp;;
      auto password(const std::string &amp;str) -&gt; auth_params&amp;;
      auto session_token(const std::string &amp;str) -&gt; auth_params&amp;;
      auto api_key(const std::string &amp;str) -&gt; auth_params&amp;;

   private:
      std::string m_account;
      std::string m_username;
      std::string m_password;
      std::string m_session_token;
      std::string m_api_key;
}; /* class auth_params */
</code></pre>
<p>nun moechte ich die daten an eine funktion uebergeben, die in einer DLL residiert. dll-boundaries und std::string ist so ne sache, also brauch ich eine reine schnittstellenklasse die folgend aussieht:</p>
<pre><code>class auth_params_interface
{
   public:
      virtual auto account(void) const noexcept -&gt; const char* = 0;
      virtual auto username(void) const noexcept -&gt; const char* = 0;
      virtual auto password(void) const noexcept -&gt; const char* = 0;
      virtual auto session_token(void) const noexcept -&gt; const char* = 0;
      virtual auto api_key(void) const noexcept -&gt; const char* = 0;
}; /* class auth_params_interface */
</code></pre>
<p>ein</p>
<pre><code>class auth_params : private class auth_params_interface
{
   public:
      auto account(void) const noexcept -&gt; const std::string&amp;;
      auto username(void) const noexcept -&gt; const std::string&amp;;
      auto password(void) const noexcept -&gt; const std::string&amp;;
      ...
      auto get_interface(void) const noexcept -&gt; const auth_params_interface*
      {
         return *this;
      }

   private:
      virtual auto account(void) const noexcept -&gt; const char*;
      virtual auto username(void) const noexcept -&gt; const char*;
      ...
};
</code></pre>
<p>kommt leider nicht in frage, weil sich die gleichnamigen funktionen nur im return type unterscheiden.</p>
<p>also hab ich mir einen adapter gebaut:</p>
<pre><code>class auth_params_interface_adapter : public auth_params_interface
{
   public:
      auth_params_interface_adapter(const auth_params &amp;p) noexcept;

      virtual auto account(void) const noexcept -&gt; const char*;
      virtual auto username(void) const noexcept -&gt; const char*;
      virtual auto password(void) const noexcept -&gt; const char*;
      virtual auto session_token(void) const noexcept -&gt; const char*;
      virtual auto api_key(void) const noexcept -&gt; const char*;

   private:
      const auth_params &amp;m_auth_params;
}; /* class auth_params_interface_adapter */
</code></pre>
<p>nun stellt sich mir gerade die frage ob ich den adapter in die auth_params klasse in den privaten bereich setze, weil ich dann via <code>auth_params::get_interface</code> mir die schnittstelle leicht holen kann. ansonsten muesste ich immer zuerst ein adapter objekt erstellen und dann mir die schnettstelle daraus holen.</p>
<p>was meint ihr ? hat die adapterklasse da was in der auth_params was zu suchen oder soll ich die extern lassen ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338586/designfrage-zu-schnittstellenklasse-und-implementierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 10:22:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338586.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Jun 2016 05:47:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 05:47:47 GMT]]></title><description><![CDATA[<p>gute morgen leute</p>
<p>ausgangspunkt ist folgende klasse:</p>
<pre><code>class auth_params
{
   public:
      auto account(void) const noexcept -&gt; const std::string&amp;;
      auto username(void) const noexcept -&gt; const std::string&amp;;
      auto password(void) const noexcept -&gt; const std::string&amp;;
      auto session_token(void) const noexcept -&gt; const std::string&amp;;
      auto api_key(void) const noexcept -&gt; const std::string&amp;;
      auto account(const std::string &amp;str) -&gt; auth_params&amp;;
      auto username(const std::string &amp;str) -&gt; auth_params&amp;;
      auto password(const std::string &amp;str) -&gt; auth_params&amp;;
      auto session_token(const std::string &amp;str) -&gt; auth_params&amp;;
      auto api_key(const std::string &amp;str) -&gt; auth_params&amp;;

   private:
      std::string m_account;
      std::string m_username;
      std::string m_password;
      std::string m_session_token;
      std::string m_api_key;
}; /* class auth_params */
</code></pre>
<p>nun moechte ich die daten an eine funktion uebergeben, die in einer DLL residiert. dll-boundaries und std::string ist so ne sache, also brauch ich eine reine schnittstellenklasse die folgend aussieht:</p>
<pre><code>class auth_params_interface
{
   public:
      virtual auto account(void) const noexcept -&gt; const char* = 0;
      virtual auto username(void) const noexcept -&gt; const char* = 0;
      virtual auto password(void) const noexcept -&gt; const char* = 0;
      virtual auto session_token(void) const noexcept -&gt; const char* = 0;
      virtual auto api_key(void) const noexcept -&gt; const char* = 0;
}; /* class auth_params_interface */
</code></pre>
<p>ein</p>
<pre><code>class auth_params : private class auth_params_interface
{
   public:
      auto account(void) const noexcept -&gt; const std::string&amp;;
      auto username(void) const noexcept -&gt; const std::string&amp;;
      auto password(void) const noexcept -&gt; const std::string&amp;;
      ...
      auto get_interface(void) const noexcept -&gt; const auth_params_interface*
      {
         return *this;
      }

   private:
      virtual auto account(void) const noexcept -&gt; const char*;
      virtual auto username(void) const noexcept -&gt; const char*;
      ...
};
</code></pre>
<p>kommt leider nicht in frage, weil sich die gleichnamigen funktionen nur im return type unterscheiden.</p>
<p>also hab ich mir einen adapter gebaut:</p>
<pre><code>class auth_params_interface_adapter : public auth_params_interface
{
   public:
      auth_params_interface_adapter(const auth_params &amp;p) noexcept;

      virtual auto account(void) const noexcept -&gt; const char*;
      virtual auto username(void) const noexcept -&gt; const char*;
      virtual auto password(void) const noexcept -&gt; const char*;
      virtual auto session_token(void) const noexcept -&gt; const char*;
      virtual auto api_key(void) const noexcept -&gt; const char*;

   private:
      const auth_params &amp;m_auth_params;
}; /* class auth_params_interface_adapter */
</code></pre>
<p>nun stellt sich mir gerade die frage ob ich den adapter in die auth_params klasse in den privaten bereich setze, weil ich dann via <code>auth_params::get_interface</code> mir die schnittstelle leicht holen kann. ansonsten muesste ich immer zuerst ein adapter objekt erstellen und dann mir die schnettstelle daraus holen.</p>
<p>was meint ihr ? hat die adapterklasse da was in der auth_params was zu suchen oder soll ich die extern lassen ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500100</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 25 Jun 2016 05:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 14:06:23 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>dll-boundaries und std::string ist so ne sache</p>
</blockquote>
<p>Ist das Problem eine unterschiedliche Implementierung der string-Klasse oder nur unterschiedliche Allokatoren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500126</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 25 Jun 2016 14:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 14:41:25 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Meep Meep schrieb:</p>
<blockquote>
<p>dll-boundaries und std::string ist so ne sache</p>
</blockquote>
<p>Ist das Problem eine unterschiedliche Implementierung der string-Klasse oder nur unterschiedliche Allokatoren?</p>
</blockquote>
<p>in dem moment nichts von beiden. aber die DLL wird so schnell nicht mehr neu kompiliert werden sondern nur die programme die darauf zugreifen. also wird relativ bald ein anderer compiler verwendet werden. vielleicht auch von einem anderen hersteller. derzeit VS2015. Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500128</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 25 Jun 2016 14:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 15:33:41 GMT]]></title><description><![CDATA[<p>Also wenn ich es richtig verstehe, geht es darum, strings lesbar weiterzugeben, ohne dass std::string selbst im Interface vorkommt.<br />
Was wäre mit einer einfachen Proxy-Klasse etwa:</p>
<pre><code>class string_view
{
    string_view(const std::string&amp; str) noexcept : str_( str.c_str() ), size_( str.size() ) {} 
    std::string operator() const noexcept { return { begin(), end() }; }
    using iterator = const char*;
    using const_iterator = iterator;
    iterator begin() const noexcept { return str_; }
    iterator end() const noexcept { return str_ + size_; }
    std::size_t size() const noexcept { return size_; }
    std::size_t length() const noexcept { return size_; }
    const char&amp; operator[](std::size_t i) const noexcept { return str_[i]; }
private:
    const char* str_;
    std::size_t size_;
};
</code></pre>
<p>Jede Interface-Funktion der DLL, die eigentlich einen std::string-Parameter nähme, bekommt statt dessen einen string_view-Parameter. Innerhalb der Funktion kann dann ggf. wieder direkt ein std::string erzeugt werden, falls das notwendig sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500135</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 25 Jun 2016 15:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 16:09:07 GMT]]></title><description><![CDATA[<p>ich sehe jetzt vielleicht dir tragweite nicht, deshalb die frage: welchen vorteil hat der proxy gegenueber meinem adapter ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500139</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 25 Jun 2016 16:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 16:45:34 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>ich sehe jetzt vielleicht dir tragweite nicht, deshalb die frage: welchen vorteil hat der proxy gegenueber meinem adapter ?</p>
<p>Meep Meep</p>
</blockquote>
<p>Dass keinerlei Änderungen auf Client-Seite und nur minimale Änderungen in der DLL erforderlich sind? Um ehrlich zu sein, habe ich noch gar nicht verstanden wie dein Adapter eingesetzt werden soll; klar ist aber, dass das keine transparente Angelegenheit ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500144</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 25 Jun 2016 16:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 17:55:54 GMT]]></title><description><![CDATA[<p>der einsatz ist folgend:</p>
<p>das ist das interface</p>
<pre><code>class auth_params_interface
{
   public:
      virtual auto account(void) const noexcept -&gt; const char* = 0;
      virtual auto username(void) const noexcept -&gt; const char* = 0;
      virtual auto password(void) const noexcept -&gt; const char* = 0;
      virtual auto session_token(void) const noexcept -&gt; const char* = 0;
      virtual auto api_key(void) const noexcept -&gt; const char* = 0;
}; /* class auth_params_interface */
</code></pre>
<p>in der DLL hab ich z.b. eine funktion der ich die parameter uebergebe:</p>
<pre><code>auto set_auth_params(auth_params_interface *params) -&gt; void;
</code></pre>
<p>und so uebergeb ichs dann:</p>
<pre><code>auth_params params;
...
auth_params_interface_adapter adapter(params);
set_auth_params(&amp;adapter);
</code></pre>
<p>das war jetzt ein vereinfachtes beispiel.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500147</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 25 Jun 2016 17:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 20:46:11 GMT]]></title><description><![CDATA[<p>Wieso nicht einfach nen struct aus Zeigern übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500160</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 25 Jun 2016 20:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sat, 25 Jun 2016 23:33:41 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>ich sehe jetzt vielleicht dir tragweite nicht, deshalb die frage: welchen vorteil hat der proxy gegenueber meinem adapter ?</p>
<p>Meep Meep</p>
</blockquote>
<p>Ich dachte erst, der Vorteil an campers Klasse wäre, dass es ein POD-Typ ist und somit auch über verschiedene Compiler hinweg funktioniert.<br />
Aber ich habe nochmal nachgeguckt und es heißt, ein POD darf keinen Konstruktor haben.</p>
<p>Dürfte man die Klasse trotzdem durch verschiedene Compiler reichen?</p>
<p>Abgesehen davon finde ich jede Art von Proxy/Adapter/EigeneStringKlasse hier falsch.<br />
C++-Binärkompatibilität macht einfach keinen Spaß.<br />
Einfach C-Funktionen nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500168</guid><dc:creator><![CDATA[La Temachio]]></dc:creator><pubDate>Sat, 25 Jun 2016 23:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to designfrage zu schnittstellenklasse und implementierung on Sun, 26 Jun 2016 03:43:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wieso nicht einfach nen struct aus Zeigern übergeben?</p>
</blockquote>
<p>weil, in dem moment wo die DLL die zugangsdaten braucht, sie erst generiert werden, bzw aus einer quelle ausgelesen werden.<br />
ich koennte genauso einen pointer auf eine funktion mituebergeben, damit die dll die daten zuerst anfordern kann und dann ueber die char-pointer darauf zugreifen kann. ich persönlicher finde es aber so eleganter.<br />
zudem schreibt/liest die DLL die daten ueber rein-virtuelle klassen die aehnlich wie die ISerialStream klasse aufgebaut sind. da moechte ich nicht mischen anfangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2500176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2500176</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 26 Jun 2016 03:43:56 GMT</pubDate></item></channel></rss>