<?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[this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine abstrakte basis klasse: &quot;M&quot;. Die hat nur wenige functionen, u.a. int getfuncs(void* begin). Diese function gibt eine liste an Name&lt;-&gt;FunctionPointer zurück.<br />
&quot;M&quot; gibts in meinem Programm und in meiner dynamischen bibliothek.</p>
<p>Ich habe eine andere klasse: &quot;init&quot;. Die basiert auf &quot;M&quot;. init hat viele eigene functionen. init redefiniert dann auch getfuncs(..). init ist in einer dynamishen bibliothek definiert.</p>
<p>Den header mit der definition/declaration von init hab ich dann nicht. Ich hab also gegeben:<br />
M* pointer, der zu einer instanz von init pointet.<br />
Ein Function pointer, der zu einer funktion(kein static, virtual, etc) von init pointet(&lt;- diese function hat M nicht). (Oder Function-to-member pointer. ich bin noch am rumprobieren was besser ist)</p>
<p>Edit:<br />
<strong>void</strong>* wird NUR in dem Codebeispiel verwendet! In meinem bisherigen code is alles normal!**</p>
<pre><code class="language-cpp">class M
{
public:
    virtual int getfuncs(void*** list) = 0;
};

// in anderem header der dynamischen bibliothek. den header hab ich NICHT
class init : M
{
private:
    int num;

    void set(int val) { num = val; } // diese
    int get() { return num; }

    virtual int getfuncs(void***) // overwrites
    {
        // tabelle irgendwie auffüllen. (würde ich ja selbst machen)
        return 2; // anzahl an funktionen.
    }
};

int main()
{
    // dlhandle: handle einder dynamischen bibliothek, wo init drin sitzt und Kaffee trinkt...
    M* something = make(dlhandle); // pointer auf init instanz (&lt;- polymorphismus)

    // MFUNC sei ein functionspointer typ...
    void** flist;
    something-&gt;getfuncs(flist);

    MFUNC* initset = flist[0];
    MFUNC* initget = flist[1];

    initset(50);
    // usw... (verwendung)
}
</code></pre>
<p>Ich dachte dann mal, einfach ein function-pointer nehmen und den this* pointer manuell auf &quot;something&quot; setzen... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280854/this-pointer-selbst-bestimmen-als-welches-objekt-eine-funktion-aufgerufen-wird</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 19:24:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280854.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Jan 2011 21:31:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 22:57:49 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine abstrakte basis klasse: &quot;M&quot;. Die hat nur wenige functionen, u.a. int getfuncs(void* begin). Diese function gibt eine liste an Name&lt;-&gt;FunctionPointer zurück.<br />
&quot;M&quot; gibts in meinem Programm und in meiner dynamischen bibliothek.</p>
<p>Ich habe eine andere klasse: &quot;init&quot;. Die basiert auf &quot;M&quot;. init hat viele eigene functionen. init redefiniert dann auch getfuncs(..). init ist in einer dynamishen bibliothek definiert.</p>
<p>Den header mit der definition/declaration von init hab ich dann nicht. Ich hab also gegeben:<br />
M* pointer, der zu einer instanz von init pointet.<br />
Ein Function pointer, der zu einer funktion(kein static, virtual, etc) von init pointet(&lt;- diese function hat M nicht). (Oder Function-to-member pointer. ich bin noch am rumprobieren was besser ist)</p>
<p>Edit:<br />
<strong>void</strong>* wird NUR in dem Codebeispiel verwendet! In meinem bisherigen code is alles normal!**</p>
<pre><code class="language-cpp">class M
{
public:
    virtual int getfuncs(void*** list) = 0;
};

// in anderem header der dynamischen bibliothek. den header hab ich NICHT
class init : M
{
private:
    int num;

    void set(int val) { num = val; } // diese
    int get() { return num; }

    virtual int getfuncs(void***) // overwrites
    {
        // tabelle irgendwie auffüllen. (würde ich ja selbst machen)
        return 2; // anzahl an funktionen.
    }
};

int main()
{
    // dlhandle: handle einder dynamischen bibliothek, wo init drin sitzt und Kaffee trinkt...
    M* something = make(dlhandle); // pointer auf init instanz (&lt;- polymorphismus)

    // MFUNC sei ein functionspointer typ...
    void** flist;
    something-&gt;getfuncs(flist);

    MFUNC* initset = flist[0];
    MFUNC* initget = flist[1];

    initset(50);
    // usw... (verwendung)
}
</code></pre>
<p>Ich dachte dann mal, einfach ein function-pointer nehmen und den this* pointer manuell auf &quot;something&quot; setzen... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010385</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sat, 22 Jan 2011 22:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 21:39:59 GMT]]></title><description><![CDATA[<p>Ich geb dir einen Tipp: Vergiss es</p>
<p>Anders ausgedrückt: Dein Design ist vollkommen unpassend für eine Sprache wie C++, du benutzt zu viele <code>void***</code> , du hast deine Frage nicht richtig gestellt.<br />
Wenn du irgendetwas dynamisches machen willst, dann nimm besser eine andere Sprache. Wobei das auch dort sinnlos ist.</p>
<p>Sag lieber, was du konkret erreichen willst, dann können wir dir eine bessere Lösung vorschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010391</guid><dc:creator><![CDATA[geht nicht]]></dc:creator><pubDate>Sat, 22 Jan 2011 21:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 21:56:49 GMT]]></title><description><![CDATA[<p>Der code oben soll nur zur veranschaulichung dienen. Ich hab ihn aus dem Kopf geschrieben.</p>
<p>Ich will Klassen dynamisch laden können. Also zur ausführungszeit komponenten meines programs laden oder entladen. Die header kennen die anderen klassen natürlich nicht. Und virtuelle funktionen will ich auch nicht, da die etwas langsamer sind....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010393</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sat, 22 Jan 2011 21:56:49 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 21:58:55 GMT]]></title><description><![CDATA[<p>Du willst ein Plug-In-System bauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010395</guid><dc:creator><![CDATA[geht nicht]]></dc:creator><pubDate>Sat, 22 Jan 2011 21:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 22:03:40 GMT]]></title><description><![CDATA[<p>Kann mir mal jemand erklären was &quot;Void**&quot; und &quot;Void***&quot; sind?</p>
<p>Google ist da ja nicht sooo hilfreich, weil es &quot;*&quot; ja immer als Platzhalte interpretiert. <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010396</guid><dc:creator><![CDATA[Zenker]]></dc:creator><pubDate>Sat, 22 Jan 2011 22:03:40 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 22:08:26 GMT]]></title><description><![CDATA[<p>void* = Zeiger auf nicht bestimmten Datentypen<br />
void** = Zeiger auf Zeiger von nicht bestimmtem Datentyp<br />
void*** = Zeiger auf Zeiger auf Zeiger von nicht bestimmten Datentypen</p>
<p>Das Sternchen steht für Zeiger google &quot;c++ pointer&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010398</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Sat, 22 Jan 2011 22:08:26 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 22:11:05 GMT]]></title><description><![CDATA[<p>Danke. Zeiger etc sind mir schon klar. Deine Erklärung hat mir schonmal viel geholfen.</p>
<p>Aber für was brauche ich einen Zeiger auf einen Zeiger (oder sogar einen Zeiger auf Zeiger auf Zeiger&quot;? Ich habe sowas bisher einmal gesehen und als Blackbox angesehen, für was braucht man sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010400</guid><dc:creator><![CDATA[Zenker]]></dc:creator><pubDate>Sat, 22 Jan 2011 22:11:05 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 22 Jan 2011 22:56:03 GMT]]></title><description><![CDATA[<p>ich verwende void*** NUR in diesem codebeispiel. In meinem wirklichem bisheringen Code habe ich alles geordnet. Ist schon gut...</p>
<p>geht nicht schrieb:</p>
<blockquote>
<p>Du willst ein Plug-In-System bauen?</p>
</blockquote>
<p>Nicht ganz... Ich kann programme auf komponenten in dynamischen bibliotheken verteilen. Das program hat also eine liste an Komponenten, zB &quot;Netwerk&quot;, &quot;Spieler&quot;, &quot;Karte&quot;, usw... (ich dachte, die könnten vielleicht noch unter-komponenten haben, unter-unter-komponenten, etc...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010407</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sat, 22 Jan 2011 22:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 23 Jan 2011 11:31:07 GMT]]></title><description><![CDATA[<p>Ich hab da auch eigenaufwand reingesteckt.... Nicht, dass ihr denkt ich bin SuperFaul...<br />
Mit diesem Problem schlag ich mich schon seit einigen wochen rum...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010522</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sun, 23 Jan 2011 11:31:07 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 23 Jan 2011 15:42:52 GMT]]></title><description><![CDATA[<p>Schau dir mal Boost bind an. Damit kannst du die häßlichen typlosen Zeigereien vermeiden und an Instanzen gebundene Klassenmethoden rufen und speichern.</p>
<p><a href="http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#with_function_objects" rel="nofollow">http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#with_function_objects</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010661</guid><dc:creator><![CDATA[Martin Fischer]]></dc:creator><pubDate>Sun, 23 Jan 2011 15:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 12:33:04 GMT]]></title><description><![CDATA[<p>Könntet Ihr mir ein Beispiel geben? Erfordert das eine zusätzliche [statische/dynamische] bibliothek oder nur die header? Ich kenne mich mit boost überhaupt nicht aus.</p>
<p>(&quot;Diese funktion als DIESE Klasse aufrufen&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011772</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Tue, 25 Jan 2011 12:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 12:35:16 GMT]]></title><description><![CDATA[<p>Für boost gilt die Regel teils/teils. Bei manchen Sachen reicht schon der header, für andere musst du boost erst auf deiner Maschine erstellen. Es gibt auch schon vorerstellte Versionen zur installation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011774</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Tue, 25 Jan 2011 12:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 13:06:21 GMT]]></title><description><![CDATA[<p>lk schrieb:</p>
<blockquote>
<p>[...]Und virtuelle funktionen will ich auch nicht, da die etwas langsamer sind....</p>
</blockquote>
<p>Langsamer als <em>was</em>? Als ein ähnlicher Mechanismus von Dir selbst gebastelt? Wohl kaum. Für Plugins braucht man wohldefinierte Interfaces. Und dafür bieten sich unter C++ Klassen mit rein virtuellen Funktionen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011789</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 25 Jan 2011 13:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 13:33:04 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>lk schrieb:</p>
<blockquote>
<p>[...]Und virtuelle funktionen will ich auch nicht, da die etwas langsamer sind....</p>
</blockquote>
<p>Langsamer als <em>was</em>? Als ein ähnlicher Mechanismus von Dir selbst gebastelt? Wohl kaum. Für Plugins braucht man wohldefinierte Interfaces. Und dafür bieten sich unter C++ Klassen mit rein virtuellen Funktionen an.</p>
</blockquote>
<p>Ich will ja nicht direkt Plugins machen.</p>
<p>Virtuelle funktionen sind einen ganz kleinen tacken langsamer als normale nicht-virtuelle funktionen. Ich werde auch viele funktionen in den plugins aufrufen, sehr oft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011813</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Tue, 25 Jan 2011 13:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 13:36:10 GMT]]></title><description><![CDATA[<p>lk, du weichst Tachyons Frage aus.</p>
<p>Wenn du eine Fallunterscheidung <em>brauchst</em>, kannst du nicht auf virtuelle Funktionen verzichten, aber gleichzeitig keine Alternative ( <code>if</code> , <code>switch</code> , etc.) anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011817</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 25 Jan 2011 13:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Tue, 25 Jan 2011 13:51:47 GMT]]></title><description><![CDATA[<p>Der Aufruf einer virtueller Funktion kostet etwas ja. Allerdings bekommst du dafür ja auch etwas, dass du in einer &quot;normalen&quot; Funktion nachbilden musst (irgendeine Art von verzweigung). Normalerweise braucht man sich da keine Sorgen machen.<br />
Deine Aufgabe habe ich allerdings eher in diese Richtung verstanden:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;iterator&gt;
#include &lt;functional&gt;
#include &lt;stdexcept&gt;

class M
{
public:
    typedef std::map&lt;std::string, std::function&lt;void(void)&gt; &gt; MethodMap;
    typedef std::insert_iterator&lt;MethodMap&gt; Inserter;
    typedef MethodMap::const_iterator Iterator;

    virtual ~M(){};

    void init()
    {
        getfuncs(Inserter(methods_, methods_.begin()));
    }

    void Call(const std::string&amp; method)
    {
        Iterator it = methods_.find(method);
        if (it == LastMethod())
            throw std::runtime_error(&quot;Unknown method name.&quot;);
        it-&gt;second();
    }

    Iterator FirstMethod() const
    {
        return methods_.begin();
    }

    Iterator LastMethod() const
    {
        return methods_.end();
    }

private:
    virtual void getfuncs(Inserter i) = 0;
    MethodMap methods_;
};

// irgendwo
class init : public M
{
public:
    void foo() { std::cout &lt;&lt; &quot;fooo\n&quot;; }
    void bar() { std::cout &lt;&lt; &quot;baar\n&quot;; }
private:
    void getfuncs(Inserter i)
    {
        i = std::make_pair(&quot;foo&quot;, std::bind(&amp;init::foo, this));
        ++i = std::make_pair(&quot;bar&quot;, std::bind(&amp;init::bar, this));
    }
};

int main() 
{
    M* m = new init; 
    m-&gt;init();
    std::cout &lt;&lt; &quot;available methods:\n&quot;;
    for(M::Iterator i = m-&gt;FirstMethod(), e = m-&gt;LastMethod();
        i != e; ++i)
    {
        std::cout &lt;&lt; i-&gt;first &lt;&lt; &quot;\n&quot;;
    }

    std::cout &lt;&lt; &quot;call:&quot;;
    std::string method;
    std::cin &gt;&gt; method;
    try
    {
        m-&gt;Call(method);
    }
    catch(std::exception&amp; e)
    {
        std::cout &lt;&lt; e.what();
    }

    delete m;
    return 0;
}
</code></pre>
<p>edit: Jetzt bin ich mir doch nicht mehr sicher was du meinst. Wenn es dir immer nur um die get und set geht, dann ist das tatsächlich ganz einfach mit virtuellen Methoden am effektivsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2011828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2011828</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 25 Jan 2011 13:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 29 Jan 2011 19:46:29 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ich versuche das geschehen nachzuverfolgen. Ich komme hierbei nicht weiter:</p>
<p><a href="http://pastebin.com/0RDGSai7" rel="nofollow">Fehlermeldung</a><br />
Wenn ich list-&gt;push_back(..) entferne, compiliert es.</p>
<pre><code class="language-cpp">class BASE
{
public:
	typedef pair&lt;string, function&lt;int(int)&gt; &gt; FEntry;
	typedef vector&lt;FEntry&gt; FList;

	virtual FList* getFuncs() = 0;
};

class MOD : public BASE
{
public:
	virtual FList* getFuncs()
	{
		FList* list = new FList();

		/*
		 *   i = std::make_pair(&quot;foo&quot;, std::bind(&amp;init::foo, this));
		 * ++i = std::make_pair(&quot;bar&quot;, std::bind(&amp;init::bar, this));
		 * */

        // HIER
		list-&gt;push_back( (FEntry)make_pair( &quot;mow&quot;, bind(&amp;MOD::mow, this) ));

		//ENTRY(&quot;Sub&quot;, sub); // mittels define

		return list;
	}

	int mow(int in)
	{
		return in * 2;
	}

	int sub(int in)
	{
		return in - 100;
	}
};

int main()
{
    // noch leer
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2014007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014007</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sat, 29 Jan 2011 19:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 29 Jan 2011 20:46:20 GMT]]></title><description><![CDATA[<p>Du kannst this nicht an MOD::mow binden. Der Typ des zweiten Arguments von bind muss schon mit dem übereinstimmen, den MOD::mow erwartet, also int. Außerdem sollte man die Referenz (glaube ich) besser durch boost::ref ersetzen.</p>
<p>Hast du schonmal überlegt auf Funktoren umzusteigen, anstatt Funktionen zurückzugeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014021</guid><dc:creator><![CDATA[~~~~]]></dc:creator><pubDate>Sat, 29 Jan 2011 20:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sat, 29 Jan 2011 21:07:41 GMT]]></title><description><![CDATA[<p>lk schrieb:</p>
<blockquote>
<p>Virtuelle funktionen sind einen ganz kleinen tacken langsamer als normale nicht-virtuelle funktionen. Ich werde auch viele funktionen in den plugins aufrufen, sehr oft...</p>
</blockquote>
<p>Du willst also dynamic binding ohne eine zusätzliche Indirektion? Sry aber das ist ganz einfach nicht möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014026</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 29 Jan 2011 21:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 30 Jan 2011 09:52:04 GMT]]></title><description><![CDATA[<pre><code class="language-schrieb:">&gt; Du kannst this nicht an MOD::mow binden. Der Typ des zweiten Arguments von bind muss schon mit dem übereinstimmen, den MOD::mow erwartet, also int. Außerdem sollte man die Referenz (glaube ich) besser durch boost::ref ersetzen.  
&gt;   
&gt; Hast du schonmal überlegt auf Funktoren umzusteigen, anstatt Funktionen zurückzugeben?

Ich kenn mich mit Boost nicht so gut aus. Beispielcode wäre nett...  

Sollte ich dann `boost::bind(&amp;MOD::mow, _1, this)` aufrufen? Für zwei Parameter dann `_1, _2` ?  

Im Detail, was macht der Code genau ?</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2014096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014096</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sun, 30 Jan 2011 09:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 30 Jan 2011 10:05:01 GMT]]></title><description><![CDATA[<p>lk schrieb:</p>
<blockquote>
<p>Sollte ich dann <code>boost::bind(&amp;MOD::mow, _1, this)</code> aufrufen? Für zwei Parameter dann <code>_1, _2</code> ?</p>
</blockquote>
<p>Nein, boost::bind(&amp;MOD::mow, this, _1 ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014098</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 30 Jan 2011 10:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 30 Jan 2011 10:44:31 GMT]]></title><description><![CDATA[<p>lk schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>lk schrieb:</p>
<blockquote>
<p>[...]Und virtuelle funktionen will ich auch nicht, da die etwas langsamer sind....</p>
</blockquote>
<p>Langsamer als <em>was</em>? Als ein ähnlicher Mechanismus von Dir selbst gebastelt? Wohl kaum. Für Plugins braucht man wohldefinierte Interfaces. Und dafür bieten sich unter C++ Klassen mit rein virtuellen Funktionen an.</p>
</blockquote>
<p>Ich will ja nicht direkt Plugins machen.</p>
<p>Virtuelle funktionen sind einen ganz kleinen tacken langsamer als normale nicht-virtuelle funktionen. Ich werde auch viele funktionen in den plugins aufrufen, sehr oft...</p>
</blockquote>
<p>so what... Lies Dich mal in das Thema: &quot;Premature Optimizing&quot; ein, denn genau das machst Du gerade. Du versuchst ein etabiliertes, optimiertes System (virtuelle Funktion) durch etwas ähnliches zu ersetzen was unterm Strich eher langsamer als schneller sein wird. Abgesehen davon, selbst wenn der Aufruf einer virtuellen Funktion langsamer ist, so macht das vielleicht 0.000001% Deiner Rechnerperformance aus. Optimier lieber erstmal an anderen Stellen die auch eine meßbare Auswirkung auf die Performance haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014103</guid><dc:creator><![CDATA[loks]]></dc:creator><pubDate>Sun, 30 Jan 2011 10:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 30 Jan 2011 11:06:01 GMT]]></title><description><![CDATA[<p>Dynamic Binding geht eben über eine Indirektion. Wenn bei dem was du vorhast der Overhead dieser zusätzlichen Indirektion zu groß ist dann kannst du schlicht und einfach kein dynamic Binding verwenden, denn dieser Overhead ist rein prinzipieller Natur und hat nichts mit irgendeiner Ineffizienz in der Implementierung von virtuellen Funktionen zu tun. Was auch immer du bastelst wirst du diesen Overhead nicht loswerden. Wenn du dir ein Ersatzsystem für virtuelle Funktionen baust dann wird dieses System immer noch eine Indirektionsschicht brauchen. Der einzige Unterschied ist am Ende nur dass du beim selbst gebastelten System deine Funktionspointer selbst verwaltest und bei virtuellen Funktionen der Compiler das für dich übernimmt. Der Overhead liegt aber in der Natur der Sache und ist daher in deinem System genauso drin, auch wenn du das per Hand in Assembler schreibst ändert sich da nix dran.</p>
<p>Die Aussage dass virtuelle Funktionen langsam sind ist jedenfalls vollkommen Sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2014107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014107</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 30 Jan 2011 11:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to this* pointer: Selbst bestimmen, als welches objekt eine funktion aufgerufen wird... ? on Sun, 30 Jan 2011 11:45:40 GMT]]></title><description><![CDATA[<p>loks schrieb:</p>
<blockquote>
<p>so what... Lies Dich mal in das Thema: &quot;Premature Optimizing&quot; ein, denn genau das machst Du gerade. Du versuchst ein etabiliertes, optimiertes System (virtuelle Funktion) durch etwas ähnliches zu ersetzen was unterm Strich eher langsamer als schneller sein wird. Abgesehen davon, selbst wenn der Aufruf einer virtuellen Funktion langsamer ist, so macht das vielleicht 0.000001% Deiner Rechnerperformance aus. Optimier lieber erstmal an anderen Stellen die auch eine meßbare Auswirkung auf die Performance haben.</p>
</blockquote>
<p>Ein anderes Problem wäre, dass ich dann 2 zusätzliche klassen für jede klasse machen müsste. Übrigens hab ichs gerade hingekriegt...</p>
<p>Ein schwacher Punkt wird wohl Baz::assign(..) sein... <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="😞"
    /></p>
<p>Mein Code jetzt:<br />
(in die main() funktion gucken <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="😃"
    /> )</p>
<pre><code class="language-cpp">class Foo
{
public:
    typedef function&lt;int(int)&gt; Func;
    typedef pair&lt;string, Func &gt; FEntry;
    typedef vector&lt;FEntry&gt; FList;

    //typedef int(Foo::* F)(int); // one static function
    //typedef vector&lt; F &gt; FL; // list of all of them

    virtual FList* getFuncs() = 0;
};

class Bar : public Foo
{
private:
    int data;

public:
    virtual FList* getFuncs()
    {
        FList* list = new FList();

        #define ENTRY(x,y) list-&gt;push_back(std::make_pair( string( x ) , boost::bind( &amp;Bar:: y , this, _1 ) ));

        list-&gt;push_back( std::make_pair(string(&quot;mow&quot;), boost::bind(&amp;Bar::mow, this, _1) ) );
        list-&gt;push_back( std::make_pair(string(&quot;sub&quot;), boost::bind(&amp;Bar::sub, this, _1) ) );

        // hehehe :)
        ENTRY(&quot;set&quot;, set);
        ENTRY(&quot;get&quot;, get);

        /*
         *   i = std::make_pair(&quot;foo&quot;, std::bind(&amp;init::foo, this));
         * ++i = std::make_pair(&quot;bar&quot;, std::bind(&amp;init::bar, this));
         * */

        // list-&gt;push_back( (FEntry)make_pair( &quot;mow&quot;, boost::bind(&amp;Bar::mow, 435, this) ));

        //ENTRY(&quot;Sub&quot;, sub);

        return list;
    }

    int set(int val)
    {
        data = val;
        return val;
    }

    int get (int dummy)
    {
        return data;
    }

    int mow(int in)
    {
        return in * 2;
    }

    int sub(int in)
    {
        return in - 100;
    }
};

struct Baz
{
    typedef Foo::Func f;

    int assign(Foo* foo)
    {
        Foo::FList *list = foo-&gt;getFuncs();
        Foo::FEntry cur;

        //cout &lt;&lt; &quot;Baz::assign] list = &quot; &lt;&lt; list &lt;&lt; endl;

        for (int i=0; i&lt;list-&gt;size(); i++)
        {
            // switch mit strings o.O ?

            cur = list-&gt;at(i);

            //cout &lt;&lt; &quot;Baz::assign - for] cur.1=\&quot;&quot; &lt;&lt; cur.first &lt;&lt; &quot; &amp;cur.2=&quot; &lt;&lt; &amp;cur.second &lt;&lt; endl;

            if (!cur.first.compare(&quot;mow&quot;)) {
                mow = cur.second;
                continue;
            } else if (!cur.first.compare(&quot;sub&quot;)) {
                sub = cur.second;
                continue;
            } else if (!cur.first.compare(&quot;set&quot;)) {
                set = cur.second;
                continue;
            } else if (!cur.first.compare(&quot;get&quot;)) {
                get = cur.second;
                continue;
            }
            cout &lt;&lt; &quot;Baz::assign - for] Pointless function: &quot; &lt;&lt; cur.first &lt;&lt; endl; // keine Übereinstimmung gefunden
        }
        return 0;
    }

    f mow;
    f sub;
    f set;
    f get;
};

int main()
{
    Foo *ptr = new Bar(); // hier würde eigentlich eine funktion aus der Dynamischen bibliothek
    // aufgerufen werden: make();

    /*
    Foo::FList *flist = ptr-&gt;getFuncs();
    Foo::FEntry e_mow = flist-&gt;at(1);
    Foo::Func mow = e_mow.second;

    Foo::Func set = flist-&gt;at(2).second;
    Foo::Func get = flist-&gt;at(3).second;

    cout &lt;&lt; set(352) &lt;&lt; endl;
    cout &lt;&lt; get(0) &lt;&lt; endl;
    */

    Baz *bar = new Baz(); // &quot;pseudo klasse&quot;

    bar-&gt;assign(ptr);

    bar-&gt;set(372);
    cout &lt;&lt; bar-&gt;get(0) &lt;&lt; endl;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2014120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2014120</guid><dc:creator><![CDATA[lk]]></dc:creator><pubDate>Sun, 30 Jan 2011 11:45:40 GMT</pubDate></item></channel></rss>