<?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[Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime]]></title><description><![CDATA[<pre><code class="language-cpp">if(strcmp(url, &quot;/&quot;) == 0 || strcmp(url, &quot;/login&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new LoginPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/logout&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new LogoutPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/list/emails&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new ListEmailPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/create/email/or/change/pass&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new CreateEmailOrChangePassPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/delete/email&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new DeleteEmailPage(connection, httpMethod));
		}
</code></pre>
<p>Ich programmiere ein bisschen HTTP Funktionalität in C++ und weiß gerade nicht, wie man das hier in eine Map&lt;std::string, ???&gt; packen kann? Ein Funktionspointer geht ja schlecht auf nen Constructor (ist wohl auch verboten nach Standard, wie mir Google sagt), was mach ich also hier?</p>
<p>Die Klassen sind natürlich alle Kinder einer Base Klasse (bzw. in diesem Fall ist conData sogar ein void** Pointer, jaja, diese C libraries immer).</p>
<p>PS: Die Idee, static Member Funktionen zu schreiben, die nichts anderes machen, als das Objekt zu erzeugen und zurückzugeben, hatte ich schon. Und dann darauf natürlich Funktionspointer zu setzen.. Aber vielleicht gibt es ja noch etwas eleganteres..</p>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258413/funktionspointer-auf-constructor-bzw-erstellung-von-unbekannter-klasse-runtime</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 11:28:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258413.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 10 Jan 2010 11:48:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 11:57:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if(strcmp(url, &quot;/&quot;) == 0 || strcmp(url, &quot;/login&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new LoginPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/logout&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new LogoutPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/list/emails&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new ListEmailPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/create/email/or/change/pass&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new CreateEmailOrChangePassPage(connection, httpMethod));
		}
		else if(strcmp(url, &quot;/delete/email&quot;) == 0)
		{
			*conData = (void*)(connectionInfo = new DeleteEmailPage(connection, httpMethod));
		}
</code></pre>
<p>Ich programmiere ein bisschen HTTP Funktionalität in C++ und weiß gerade nicht, wie man das hier in eine Map&lt;std::string, ???&gt; packen kann? Ein Funktionspointer geht ja schlecht auf nen Constructor (ist wohl auch verboten nach Standard, wie mir Google sagt), was mach ich also hier?</p>
<p>Die Klassen sind natürlich alle Kinder einer Base Klasse (bzw. in diesem Fall ist conData sogar ein void** Pointer, jaja, diese C libraries immer).</p>
<p>PS: Die Idee, static Member Funktionen zu schreiben, die nichts anderes machen, als das Objekt zu erzeugen und zurückzugeben, hatte ich schon. Und dann darauf natürlich Funktionspointer zu setzen.. Aber vielleicht gibt es ja noch etwas eleganteres..</p>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836154</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sun, 10 Jan 2010 11:57:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 12:00:16 GMT]]></title><description><![CDATA[<p>Du könntest deine Objekte gemäss einem Prototype erzeugen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Prototype Pattern</p>
<p>Oder Du könntest das Abtract Factory Pattern anwenden. Dabei werden dann Konkrete Factories in der Map gehalten.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836164</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 12:03:16 GMT]]></title><description><![CDATA[<p>Du könntest dir eine Factory mit statischen Methoden anlegen und diese dann in die Map eintragen (als normale Funktionspointer).<br />
So in der Art:</p>
<pre><code class="language-cpp">class Factory
{
  static ConnectionBase* CreateLoginPage(const string&amp; connection, const string&amp; httpMethod)
  {
     return new LoginPage(connection, httpMethod);
  }

  // ...
};

typedef ConnectionBase* (*ConnFunc)(const string&amp; connection, const string&amp; httpMethod);

std::map&lt;std::string, ConnFunc&gt; conn_map;
conn_map[&quot;/login&quot;] = Factory::CreateLoginPage;
...

// Zugriff
std::map::iterator it = conn_map.find(url);
if(it != conn_map.end())
{
  connectionInfo = it-&gt;second(connection, httpMethod);
}
</code></pre>
<p>Ich hoffe, du verstehst diesen Ansatz?</p>
<p>Und auf den 'void**' solltest du in dem Programm verzichten (sondern nur beim Zugriff auf die Lib entsprechend 'casten')!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836168</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 12:17:35 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Und auf den 'void**' solltest du in dem Programm verzichten (sondern nur beim Zugriff auf die Lib entsprechend 'casten')!</p>
</blockquote>
<p>Das muss ich leider an der Stelle so machen (der void** Pointer ist quasi der Zugriff auf die Library)</p>
<p>Prototyping passt da nicht so, aber diese Factory ist ganz interessant.</p>
<p>Nur wo ist der Unterschied zwischen ner Factory und dass jede Klasse ihre eigene create Methode hätte?</p>
<pre><code class="language-cpp">class LoginPage
{
  static LoginPage* create(Connection* connection, HttpMethod httpMethod)
  {
     return new LoginPage(connection, httpMethod);
  }

  // ...
};
</code></pre>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836172</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 12:24:37 GMT]]></title><description><![CDATA[<p>Ohne großen zusätzlichen Aufwand für jede Klasse gehts auch so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;boost/shared_ptr.hpp&gt;
using namespace std;
using namespace boost;

template &lt;class Object_&gt;
class object_creator
{
public:

	typedef Object_ object_type;

	virtual ~object_creator()
	{
	}

	virtual object_type *create() = 0;
};

template &lt;class Creator_, class Object_&gt;
class special_creator : public Creator_
{
	typename Creator_::object_type *create()
	{
		return new Object_();
	}
};

class page
{
public:

	virtual ~page()
	{
	}

	virtual void print()
	{
		cout &lt;&lt; &quot;page&quot; &lt;&lt; endl;
	}
};

class login_page : public page
{
public:

	void print()
	{
		cout &lt;&lt; &quot;login&quot; &lt;&lt; endl;
	}
};

typedef object_creator&lt;page&gt; page_creator;

int main()
{
	map&lt;string, shared_ptr&lt;page_creator&gt; &gt; creators;

	creators[&quot;/login&quot;].reset(new special_creator&lt;page_creator, login_page&gt;());

	shared_ptr&lt;page&gt;(creators[&quot;/login&quot;]-&gt;create())-&gt;print();

	cin.get();
}
</code></pre>
<p>So fällt zwar die Möglichkeit weg, das Object per Konstruktor mit Argumenten zu befüllen, aber das lässt sich auch mit <code>init()</code> oder so machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836181</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:24:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 12:26:30 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ohne großen zusätzlichen Aufwand für jede Klasse gehts auch so:</p>
</blockquote>
<p>Danke, das sieht nach einer optimalen Lösung aus!</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>So fällt zwar die Möglichkeit weg, das Object per Konstruktor mit Argumenten zu befüllen, aber das lässt sich auch mit <code>init()</code> oder so machen.</p>
</blockquote>
<p>Da ich immer die gleichen 2 Parameter habe, sollte doch das Template anpassbar sein, für diese Parameter, oder?</p>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836183</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 13:32:49 GMT]]></title><description><![CDATA[<p>NewSoftzzz schrieb:</p>
<blockquote>
<p>Da ich immer die gleichen 2 Parameter habe, sollte doch das Template anpassbar sein, für diese Parameter, oder?</p>
</blockquote>
<p>Ich habe ein wenig experimentiert und das ganze in leicht veränderter Form für bis zu 3 beliebige Parameter gemacht. Weiß jemand, ob es das schon in Boost gibt? Dann wäre es nämlich unnötig, meine unordentliche Lösung zu verwenden.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;boost/shared_ptr.hpp&gt;
using namespace std;
using namespace boost;

struct null_type
{
};

template &lt;class Base_, class Arg1 = null_type, class Arg2 = null_type, class Arg3 = null_type&gt;
class ctor_ptr_base
{
public:

	typedef Base_ base_t;

	virtual ~ctor_ptr_base()
	{
	}

	virtual base_t * operator ()() const
	{
		return 0;
	}

	virtual base_t * operator ()(const Arg1 &amp;arg1) const
	{
		return 0;
	}

	virtual base_t * operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2) const
	{
		return 0;
	}

	virtual base_t * operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2, const Arg3 &amp;arg3) const
	{
		return 0;
	}
};

template &lt;class T, class Base, class Arg1 = null_type, class Arg2 = null_type, class Arg3 = null_type&gt;
class ctor_ptr_impl : public ctor_ptr_base&lt;Base, Arg1, Arg2, Arg3&gt;
{
public:

	base_t * operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2, const Arg3 &amp;arg3) const
	{
		return new T(arg1, arg2, arg3);
	}
};

template &lt;class T, class Base&gt;
class ctor_ptr_impl&lt;T, Base&gt; : public ctor_ptr_base&lt;Base&gt;
{
public:

	typename base_t * operator ()() const
	{
		return new T();
	}
};

template &lt;class T, class Base, class Arg1&gt;
class ctor_ptr_impl&lt;T, Base, Arg1&gt; : public ctor_ptr_base&lt;Base, Arg1&gt;
{
public:

	base_t * operator ()(const Arg1 &amp;arg1) const
	{
		return new T(arg1);
	}
};

template &lt;class T, class Base, class Arg1, class Arg2&gt;
class ctor_ptr_impl&lt;T, Base, Arg1, Arg2&gt; : public ctor_ptr_base&lt;Base, Arg1, Arg2&gt;
{
public:

	base_t * operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2) const
	{
		return new T(arg1, arg2);
	}
};

template &lt;class Base, class Arg1 = null_type, class Arg2 = null_type, class Arg3 = null_type&gt;
class ctor_ptr
{
public:

	template &lt;class T&gt;
	void setType()
	{
		m_base.reset(new ctor_ptr_impl&lt;T, Base, Arg1, Arg2, Arg3&gt;());
	}

	Base *operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2, const Arg3 &amp;arg3) const
	{
		return (*m_base.get())(arg1, arg2, arg3); 
	}

private:

	boost::shared_ptr&lt;ctor_ptr_base&lt;Base, Arg1, Arg2, Arg3&gt; &gt; m_base;
};

template &lt;class Base&gt;
class ctor_ptr&lt;Base&gt;
{
public:

	template &lt;class T&gt;
	void setType()
	{
		m_base.reset(new ctor_ptr_impl&lt;T, Base&gt;());
	}

	Base *operator ()() const
	{
		return (*m_base)(); 
	}

private:

	boost::shared_ptr&lt;ctor_ptr_base&lt;Base&gt; &gt; m_base;
};

template &lt;class Base, class Arg1&gt;
class ctor_ptr&lt;Base, Arg1&gt;
{
public:

	template &lt;class T&gt;
	void setType()
	{
		m_base.reset(new ctor_ptr_impl&lt;T, Base, Arg1&gt;());
	}

	Base *operator ()(const Arg1 &amp;arg1) const
	{
		return (*m_base)(arg1); 
	}

private:

	boost::shared_ptr&lt;ctor_ptr_base&lt;Base, Arg1&gt; &gt; m_base;
};

template &lt;class Base, class Arg1, class Arg2&gt;
class ctor_ptr&lt;Base, Arg1, Arg2&gt;
{
public:

	template &lt;class T&gt;
	void setType()
	{
		m_base.reset(new ctor_ptr_impl&lt;T, Base, Arg1, Arg2&gt;());
	}

	Base *operator ()(const Arg1 &amp;arg1, const Arg2 &amp;arg2) const
	{
		return (*m_base)(arg1, arg2); 
	}

private:

	boost::shared_ptr&lt;ctor_ptr_base&lt;Base, Arg1, Arg2&gt; &gt; m_base;
};

class page
{
public:

	page(int i)
	{
		cout &lt;&lt; &quot;ctor page &quot; &lt;&lt; i &lt;&lt; endl;
	}

	virtual ~page()
	{
		cout &lt;&lt; &quot;dtor page&quot; &lt;&lt; endl;
	}
};

class login_page : public page
{
public:

	login_page(int i)
		: page(i)
	{
		cout &lt;&lt; &quot;ctor login_page&quot; &lt;&lt; endl;
	}

	virtual ~login_page()
	{
		cout &lt;&lt; &quot;dtor login_page&quot; &lt;&lt; endl;
	}
};

class logout_page : public page
{
public:

	logout_page(int i)
		: page(i)
	{
		cout &lt;&lt; &quot;ctor logout_page&quot; &lt;&lt; endl;
	}

	virtual ~logout_page()
	{
		cout &lt;&lt; &quot;dtor logout_page&quot; &lt;&lt; endl;
	}
};

int main()
{
	{
		map&lt;string, ctor_ptr&lt;page, int&gt; &gt; ctors;

		ctors[&quot;/login&quot;].setType&lt;login_page&gt;();
		ctors[&quot;/logout&quot;].setType&lt;logout_page&gt;();

		page *p = ctors[&quot;/login&quot;](123);
		delete p;
	}

    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836233</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 10 Jan 2010 13:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 13:34:22 GMT]]></title><description><![CDATA[<p>Es gibt auf jeden Fall boost::bind für solche Sachen mit normalen Funktionen, aber ich hab keine Ahnung, ob das wiederum für Ctors funktionieren würde..</p>
<p><a href="http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html" rel="nofollow">http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html</a></p>
<p>mfg~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836235</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sun, 10 Jan 2010 13:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer auf Constructor, bzw. Erstellung von unbekannter Klasse @ Runtime on Sun, 10 Jan 2010 13:51:09 GMT]]></title><description><![CDATA[<p>Hey, ich habe gerade etwas gefunden, was vllt. benutzbar ist:</p>
<p><a href="http://www.boost.org/doc/libs/1_39_0/doc/html/lambda/le_in_details.html#lambda.construction_and_destruction" rel="nofollow">http://www.boost.org/doc/libs/1_39_0/doc/html/lambda/le_in_details.html#lambda.construction_and_destruction</a></p>
<p>Ich schau's mir jetzt mal an..</p>
<p>mfg, René~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836253</guid><dc:creator><![CDATA[NewSoftzzz]]></dc:creator><pubDate>Sun, 10 Jan 2010 13:51:09 GMT</pubDate></item></channel></rss>