<?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[Wie portable Library designen]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich bastle wieder an meiner Library, ich möchte (immer noch) Prozesse plattformunabhängig repräsentieren.</p>
<p>Mein aktueller Ansatz ist:<br />
Eine Klasse process, die komplett abstrakt ist und von den Klassen win32_process, linux_process, bsd_process etc implementiert wird.<br />
Dazu implementiert jede dieser Klassen noch zusätzliche Features, die nur auf diesen System verfügbar sind. Möchte jetzt jemand diese Features, dann muss er den Basisklassenzeiger bewusst auf die abgeleitete Klasse casten, dh. man sagt explizit dass man auf nicht-plattformunabhängige Funktionen zurückgreifen möchte. Erzeugt werden diese Instanzen von einer Factory-Funktion, die unter der Haube den richtigen Prozess für das aktuelle System aus wählt (bzw die anderen wären sowieso nicht verfügbar).</p>
<p>Ist das so ein gutes Design? Was wäre eine bessere Option?</p>
<p>Und vlt nicht unbedingt passend hier, aber mir sind Python-Bindings sehr wichtig, die ich mit Boost.Python schreibe. In Python gibt es allerdings nicht die Möglichkeit einfach einen &quot;Upcast&quot; zu machen, wie wäre es geschickt die Bindings zu machen?</p>
<p>Grüße und Danke,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297317/wie-portable-library-designen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 11:55:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297317.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Dec 2011 21:30:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie portable Library designen on Fri, 23 Dec 2011 21:31:09 GMT]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich bastle wieder an meiner Library, ich möchte (immer noch) Prozesse plattformunabhängig repräsentieren.</p>
<p>Mein aktueller Ansatz ist:<br />
Eine Klasse process, die komplett abstrakt ist und von den Klassen win32_process, linux_process, bsd_process etc implementiert wird.<br />
Dazu implementiert jede dieser Klassen noch zusätzliche Features, die nur auf diesen System verfügbar sind. Möchte jetzt jemand diese Features, dann muss er den Basisklassenzeiger bewusst auf die abgeleitete Klasse casten, dh. man sagt explizit dass man auf nicht-plattformunabhängige Funktionen zurückgreifen möchte. Erzeugt werden diese Instanzen von einer Factory-Funktion, die unter der Haube den richtigen Prozess für das aktuelle System aus wählt (bzw die anderen wären sowieso nicht verfügbar).</p>
<p>Ist das so ein gutes Design? Was wäre eine bessere Option?</p>
<p>Und vlt nicht unbedingt passend hier, aber mir sind Python-Bindings sehr wichtig, die ich mit Boost.Python schreibe. In Python gibt es allerdings nicht die Möglichkeit einfach einen &quot;Upcast&quot; zu machen, wie wäre es geschickt die Bindings zu machen?</p>
<p>Grüße und Danke,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160568</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 23 Dec 2011 21:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Fri, 23 Dec 2011 22:26:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Eine Klasse process, die komplett abstrakt ist und von den Klassen win32_process, linux_process, bsd_process etc implementiert wird.</p>
</blockquote>
<p>Was spricht gegen bedingte Kompilierung? Die Klassen treten nie gleichzeitig auf, sie lassen sich sogar nicht einmal gleichzeitig kompilieren. Also mach eine gepimpelte Klasse process und drei Dateien, von denen je nach Target nur eine kompiliert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160580</guid><dc:creator><![CDATA[nolib]]></dc:creator><pubDate>Fri, 23 Dec 2011 22:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Fri, 23 Dec 2011 22:30:31 GMT]]></title><description><![CDATA[<p>nolib schrieb:</p>
<blockquote>
<blockquote>
<p>Eine Klasse process, die komplett abstrakt ist und von den Klassen win32_process, linux_process, bsd_process etc implementiert wird.</p>
</blockquote>
<p>Was spricht gegen bedingte Kompilierung? Die Klassen treten nie gleichzeitig auf, sie lassen sich sogar nicht einmal gleichzeitig kompilieren. Also mach eine gepimpelte Klasse process und drei Dateien, von denen je nach Target nur eine kompiliert wird.</p>
</blockquote>
<p>Noch weniger. Einfach ifdef und globale Funktionen, die die API Wrappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160581</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 23 Dec 2011 22:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 01:04:06 GMT]]></title><description><![CDATA[<p>Ich schliesse mich volkard an was das #ifdef angeht.</p>
<p>In einem Fall, wo es nur eine Implementierung pro compilierter Version geben kann, muss man weder Factory Funktionen machen noch mit pimpl o.ä. arbeiten.</p>
<p>Wobei ich mir noch nicht sicher bin, was ich für besser halte: eine Prozess-Klasse die nur das nötigste bietet (RAII + Zugriff auf das native-Handle) + freie Funktionen, oder den konservativeren Ansatz mit einer Prozess-Klasse die die nötigen Funktionen als Member-Funktionen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160599</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 24 Dec 2011 01:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 08:27:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Noch weniger. Einfach ifdef und globale Funktionen, die die API Wrappen.</p>
</blockquote>
<p>Exakt so habe ich es zur Zeit, aber irgendetwas stört mich daran. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Plattformabhängige Funktionen habe ich in extra Namespaces gestopft, so gibt es ein unix_like::get_procfs_directory etc</p>
<p>Ich weiß halt nur nicht was ich in die Prozess-Klasse selbst stecken soll. Unter Linux verkommt sie zu nem winzigen Wrapper um int, ner Windows-Version würde ich auch ungern eine HANDLE get_handle() Funktion direkt verpassen.</p>
<p>Angenommen mein Ansatz mit den Namespaces für plattformabhängige Funktionen ist so gut, was wäre davon zu halten eine freie win32::get_process_handle Funktion zu bauen, die ein friend von process ist und der einzige Accessor auf das Handle ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160612</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 24 Dec 2011 08:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 09:40:40 GMT]]></title><description><![CDATA[<p>Hauptsache, der Typ ist auch geifdeft, und im Nutzcode mußt Du nicht jedesmal dran denken, wo Du jetzt bist.<br />
Also nicht HANDLE win32::get_process_handle(), sondern os::handle os::get_process_handle().<br />
(Das senkt auch die Compilezeiten ist Nichts.)<br />
Ob eine Prozess-Klasse überhaupt sinnvoll ist, weiß ich nicht. Bei Semaphoren, Dateien, Mutexen weiß ich es, wegen RAII. Diese Klassen haben optimalerweise schon gar kein ifdef mehr drin, das geht auch, weil die zugehörigen Funktionen beider Betriebssysteme fast gleich sind.<br />
Ich weiß auch nicht, was der accessor auf das Handle jetzt bezwecken soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160631</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Dec 2011 09:40:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 12:33:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Hauptsache, der Typ ist auch geifdeft, und im Nutzcode mußt Du nicht jedesmal dran denken, wo Du jetzt bist.<br />
Also nicht HANDLE win32::get_process_handle(), sondern os::handle os::get_process_handle().<br />
(Das senkt auch die Compilezeiten ist Nichts.)</p>
</blockquote>
<p>Jup, Windows.h will ich auf keinen Fall im Header haben, würde einfach void* als Handletyp nehmen, das sollte mit allen Windows-Versionen der Vergangenheit und Zukunft funktionieren.</p>
<blockquote>
<p>Ob eine Prozess-Klasse überhaupt sinnvoll ist, weiß ich nicht. Bei Semaphoren, Dateien, Mutexen weiß ich es, wegen RAII.</p>
</blockquote>
<p>Unter Windows schon, auch wegen RAII, die Handles müssen ja geschlossen werden, können dupliziert werden etc. Bei Unixen bringt es reichlich wenig, sollte aber auch kein Nachteil sein.</p>
<blockquote>
<p>Ich weiß auch nicht, was der accessor auf das Handle jetzt bezwecken soll.</p>
</blockquote>
<p>Um direkt mit der WinAPI arbeiten zu können, falls das jemand so machen möchte.</p>
<p>Danke für die Antworten, ich werds wohl mal so machen. <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>....</p>
<p>eine Frage noch: Was könnte ich mit den plattformabhängigen Funktionen machen, wenn sie auf der falschen Plattform benutzt werden? Sollen sie da gar nicht existieren, also muss der Nutzcode möglicherweise ge-ifdef-ed werden. Exceptionwerfen/assert? Oder einfach Dummy-Wert zurückgeben (leeren String, null oä.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160686</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 24 Dec 2011 12:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 12:36:09 GMT]]></title><description><![CDATA[<p>Sollten da nicht existieren, imo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160687</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 24 Dec 2011 12:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie portable Library designen on Sat, 24 Dec 2011 15:01:54 GMT]]></title><description><![CDATA[<p>Ja, die sollte es auf keinen Fall geben.</p>
<p>Ein paar #ifdef im Client Code sind IMO besser als dass es ne Funktion gibt, die dann nix tut. Lieber beim Compilieren schon merken dass was fehlt, als dann komische Fehler bei der Ausführung haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160717</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 24 Dec 2011 15:01:54 GMT</pubDate></item></channel></rss>