<?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[SharedObjects und Klassen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite derzeit an der Lösung für folgendes Problem:<br />
Aus einem SharedObject (.so / .dll) möchte ich die Implementierung einer Klasse (die Deklaration in Form einer Header-Datei zugrundeliegend) laden.</p>
<p>Den bisherigen Code findet ihr auf GitHub: <a href="https://github.com/cgloeckner/sharedclasses" rel="nofollow">https://github.com/cgloeckner/sharedclasses</a></p>
<p>Hier die main.cpp - sie zeit quasi die &quot;aktuelle Bedienung&quot; des Ganzen:</p>
<pre><code>#include &quot;core/LibraryWrapper.hpp&quot;

namespace engine {
    #include &quot;Demo.hpp&quot;
}

class WrappedDemo: public LibraryWrapper&lt;engine::Demo&gt; {

    public:
        WrappedDemo(): LibraryWrapper&lt;engine::Demo&gt;(&quot;Demo&quot;, &quot;Demo&quot;) {
            engine::Demo* (*create)() = (engine::Demo* (*)())(
                this-&gt;load_function(&quot;create_Demo&quot;)
            );
            this-&gt;data = create();

            std::cout &lt;&lt; &quot;WrappedDemo()&quot; &lt;&lt; std::endl;
        }
        WrappedDemo(double initwert): LibraryWrapper&lt;engine::Demo&gt;(&quot;Demo&quot;, &quot;Demo&quot;) {
            engine::Demo* (*create)(double) = (engine::Demo* (*)(double))(
                this-&gt;load_function(&quot;create_Demo_double&quot;)
            );
            this-&gt;data = create(initwert);

            std::cout &lt;&lt; &quot;WrappedDemo(double)&quot; &lt;&lt; std::endl;
        }
        ~WrappedDemo() {
            std::cout &lt;&lt; &quot;~WrappedDemo()&quot; &lt;&lt; std::endl;
        }

        void foo() {
            this-&gt;data-&gt;foo();
        }
        int bar(double value) {
            return this-&gt;data-&gt;bar(value);
        }

        double get_wert() {
            return this-&gt;data-&gt;wert;
        }
        void set_wert(double value) {
            this-&gt;data-&gt;wert = value;
        }

};

int main() {
    WrappedDemo* demo = new WrappedDemo(24532.2);
    demo-&gt;foo();
    std::cout &lt;&lt; &quot;Wert: &quot; &lt;&lt; demo-&gt;get_wert() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;als int: &quot; &lt;&lt; demo-&gt;bar(demo-&gt;get_wert()) &lt;&lt; std::endl;
    delete demo;
}
</code></pre>
<p>Dabei verwende ich eine Template-Klasse LibraryWrapper&lt;T&gt;, deren Konstruktor jede Funktionen lädt, die die eigentlichen Konstruktoren bzw. Destruktoren auslösen (siehe Demo.cpp). Wird eine Instanz von LibraryWrapper&lt;T&gt; zerstört, wird der ursprüngliche Destruktor aufgerufen. Dazu verwendet die Klasse intern ein geschütztes Member data vom Typ T, das die (ursprünglich vom Original-Konstruktor erstellte) Instanz des ursprünglichen Objektes enthält. Ableitungen von LibraryWrapper&lt;T&gt; (wie WrappedDemo, siehe main.cpp) implementieren eigene Konstruktoren (mehrere Konstruktoren sind prinzipiell so möglich). Dabei gibt es mein erstes Problem: [b]Die Funktionszeiger müssen zunächst bzgl. der Funktionssignatur gecastet werden. Das sieht (a) ziemlich hässlich aus und ist (b), wenn man viele Wrapper-Klassen so erstellen will, sehr aufwändig. Hätte jemand eine Idee, wie man das umgeht?</p>
<p>Das nächste bezieht sich auf die Membervariablen der ursprünglichen Klasse, die sich innerhalb des Wrappers im data-Member befinden. Um auf sie zugreifen zu können, brauche ich Getter- und Setter-Methoden (siehe main.cpp). Auch das ist ziemlich nervig, wenn es sich um mehrere größere Klassen handelt. Meine anfängliche Idee, LibraryWrapper&lt;T&gt; von T abzuleiten, würde die Member direkt verfügbar machen. Allerdings weiß ich nicht, wie ich dann die in C-Funktionen gewrappten Konstruktoren (und um dieses in-C-Funktionen-schreiben komme ich imho nicht drumrum - wegen der Struktur der Shared Objects) korrekt aufrufe. Die (mit der C-Funktion) erstellte Instanz darf ich ja nicht direkt auf this zuweisen.</p>
<p>Ich hoffe ihr wisst, auf was ich hinaus will <sup>_</sup> Ist das denn prinzipiell überhaupt möglich, was ich mir vorstelle? Ich kann mir schwerlich vorstellen, dass die &quot;größeren&quot; Anwendungen (die .so bzw .dll Dateien verwenden) alles im prozeduralen, klassenlosen Stil (also Oldschool C <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> ) behandeln.</p>
<p>Mein Ziel ist es, mit der aus der SharedObject geladenen Klassenimplementierung weitere Vererbung und somit Spezialisierung durchzuführen.</p>
<p>LG Glocke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312751/sharedobjects-und-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 17:50:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312751.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Jan 2013 11:03:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SharedObjects und Klassen on Sun, 13 Jan 2013 11:08:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite derzeit an der Lösung für folgendes Problem:<br />
Aus einem SharedObject (.so / .dll) möchte ich die Implementierung einer Klasse (die Deklaration in Form einer Header-Datei zugrundeliegend) laden.</p>
<p>Den bisherigen Code findet ihr auf GitHub: <a href="https://github.com/cgloeckner/sharedclasses" rel="nofollow">https://github.com/cgloeckner/sharedclasses</a></p>
<p>Hier die main.cpp - sie zeit quasi die &quot;aktuelle Bedienung&quot; des Ganzen:</p>
<pre><code>#include &quot;core/LibraryWrapper.hpp&quot;

namespace engine {
    #include &quot;Demo.hpp&quot;
}

class WrappedDemo: public LibraryWrapper&lt;engine::Demo&gt; {

    public:
        WrappedDemo(): LibraryWrapper&lt;engine::Demo&gt;(&quot;Demo&quot;, &quot;Demo&quot;) {
            engine::Demo* (*create)() = (engine::Demo* (*)())(
                this-&gt;load_function(&quot;create_Demo&quot;)
            );
            this-&gt;data = create();

            std::cout &lt;&lt; &quot;WrappedDemo()&quot; &lt;&lt; std::endl;
        }
        WrappedDemo(double initwert): LibraryWrapper&lt;engine::Demo&gt;(&quot;Demo&quot;, &quot;Demo&quot;) {
            engine::Demo* (*create)(double) = (engine::Demo* (*)(double))(
                this-&gt;load_function(&quot;create_Demo_double&quot;)
            );
            this-&gt;data = create(initwert);

            std::cout &lt;&lt; &quot;WrappedDemo(double)&quot; &lt;&lt; std::endl;
        }
        ~WrappedDemo() {
            std::cout &lt;&lt; &quot;~WrappedDemo()&quot; &lt;&lt; std::endl;
        }

        void foo() {
            this-&gt;data-&gt;foo();
        }
        int bar(double value) {
            return this-&gt;data-&gt;bar(value);
        }

        double get_wert() {
            return this-&gt;data-&gt;wert;
        }
        void set_wert(double value) {
            this-&gt;data-&gt;wert = value;
        }

};

int main() {
    WrappedDemo* demo = new WrappedDemo(24532.2);
    demo-&gt;foo();
    std::cout &lt;&lt; &quot;Wert: &quot; &lt;&lt; demo-&gt;get_wert() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;als int: &quot; &lt;&lt; demo-&gt;bar(demo-&gt;get_wert()) &lt;&lt; std::endl;
    delete demo;
}
</code></pre>
<p>Dabei verwende ich eine Template-Klasse LibraryWrapper&lt;T&gt;, deren Konstruktor jede Funktionen lädt, die die eigentlichen Konstruktoren bzw. Destruktoren auslösen (siehe Demo.cpp). Wird eine Instanz von LibraryWrapper&lt;T&gt; zerstört, wird der ursprüngliche Destruktor aufgerufen. Dazu verwendet die Klasse intern ein geschütztes Member data vom Typ T, das die (ursprünglich vom Original-Konstruktor erstellte) Instanz des ursprünglichen Objektes enthält. Ableitungen von LibraryWrapper&lt;T&gt; (wie WrappedDemo, siehe main.cpp) implementieren eigene Konstruktoren (mehrere Konstruktoren sind prinzipiell so möglich). Dabei gibt es mein erstes Problem: [b]Die Funktionszeiger müssen zunächst bzgl. der Funktionssignatur gecastet werden. Das sieht (a) ziemlich hässlich aus und ist (b), wenn man viele Wrapper-Klassen so erstellen will, sehr aufwändig. Hätte jemand eine Idee, wie man das umgeht?</p>
<p>Das nächste bezieht sich auf die Membervariablen der ursprünglichen Klasse, die sich innerhalb des Wrappers im data-Member befinden. Um auf sie zugreifen zu können, brauche ich Getter- und Setter-Methoden (siehe main.cpp). Auch das ist ziemlich nervig, wenn es sich um mehrere größere Klassen handelt. Meine anfängliche Idee, LibraryWrapper&lt;T&gt; von T abzuleiten, würde die Member direkt verfügbar machen. Allerdings weiß ich nicht, wie ich dann die in C-Funktionen gewrappten Konstruktoren (und um dieses in-C-Funktionen-schreiben komme ich imho nicht drumrum - wegen der Struktur der Shared Objects) korrekt aufrufe. Die (mit der C-Funktion) erstellte Instanz darf ich ja nicht direkt auf this zuweisen.</p>
<p>Ich hoffe ihr wisst, auf was ich hinaus will <sup>_</sup> Ist das denn prinzipiell überhaupt möglich, was ich mir vorstelle? Ich kann mir schwerlich vorstellen, dass die &quot;größeren&quot; Anwendungen (die .so bzw .dll Dateien verwenden) alles im prozeduralen, klassenlosen Stil (also Oldschool C <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> ) behandeln.</p>
<p>Mein Ziel ist es, mit der aus der SharedObject geladenen Klassenimplementierung weitere Vererbung und somit Spezialisierung durchzuführen.</p>
<p>LG Glocke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289233</guid><dc:creator><![CDATA[Glocke]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to SharedObjects und Klassen on Sun, 13 Jan 2013 11:45:14 GMT]]></title><description><![CDATA[<p>Ich kenn das halt eher so, dass das Plugin von einem Engine-Typen ableitet (zumeist wohl eine Schnittstelle) und nicht die Engine vom Plugin-Typen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289245</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:45:14 GMT</pubDate></item></channel></rss>