<?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[Frage zu Objektarray]]></title><description><![CDATA[<p>Ich habe mal eine prinzipielle Frage zu Arrays von Objekten.</p>
<p>Angenommen, ich habe eine Klasse Apfel (um das Problem zu abstrahieren). Jetzt habe ich eine andere Klasse Korb,die Äpfel in einem Array speichern soll. Die Korbklasse sieht ungefähr so aus:</p>
<p>Header:</p>
<pre><code class="language-cpp">class Korb
{

public:
	Korb(int maximaleApfelAnzahl);
	int  AddApfel(int durchmesser, int gueteklasse);	

private:

	int maxAepfel;
	Apfel *aepfel;
};
</code></pre>
<p>Cpp</p>
<pre><code class="language-cpp">Korb::Korb(int maximaleApfelAnzahl)
{
        this-&gt;maximaleApfelAnzahl = maximaleApfelAnzahl;
	aepfel = new Apfel[maximaleApfelAnzahl];
	for(int i = 0; i &lt; maximaleApfelAnzahl; i++)
	{
		aepfel[i] = NULL;       //geht irgendwie nicht
	}
}

int Korb::AddApfel(int durchmesser, int gueteklasse)	
{	
	for(int i = 0; i &lt; maximaleApfelAnzahl; i++)
	{
		if(aepfel[i] == NULL)
                {
                        aepfel[i] = new Apfel(durchmesser, gueteklasse);
                        return i;
                }
        }
        return -1;
}
</code></pre>
<p>Ich möchte in der add-Methode quasi den ersten freien Platz bekommen,wo kein Apfel drin gespeichert ist. Dann möchte ich da den Apfel speichern. Wie mache ich das am günstigsten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196213/frage-zu-objektarray</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 07:09:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196213.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Oct 2007 18:46:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 18:46:56 GMT]]></title><description><![CDATA[<p>Ich habe mal eine prinzipielle Frage zu Arrays von Objekten.</p>
<p>Angenommen, ich habe eine Klasse Apfel (um das Problem zu abstrahieren). Jetzt habe ich eine andere Klasse Korb,die Äpfel in einem Array speichern soll. Die Korbklasse sieht ungefähr so aus:</p>
<p>Header:</p>
<pre><code class="language-cpp">class Korb
{

public:
	Korb(int maximaleApfelAnzahl);
	int  AddApfel(int durchmesser, int gueteklasse);	

private:

	int maxAepfel;
	Apfel *aepfel;
};
</code></pre>
<p>Cpp</p>
<pre><code class="language-cpp">Korb::Korb(int maximaleApfelAnzahl)
{
        this-&gt;maximaleApfelAnzahl = maximaleApfelAnzahl;
	aepfel = new Apfel[maximaleApfelAnzahl];
	for(int i = 0; i &lt; maximaleApfelAnzahl; i++)
	{
		aepfel[i] = NULL;       //geht irgendwie nicht
	}
}

int Korb::AddApfel(int durchmesser, int gueteklasse)	
{	
	for(int i = 0; i &lt; maximaleApfelAnzahl; i++)
	{
		if(aepfel[i] == NULL)
                {
                        aepfel[i] = new Apfel(durchmesser, gueteklasse);
                        return i;
                }
        }
        return -1;
}
</code></pre>
<p>Ich möchte in der add-Methode quasi den ersten freien Platz bekommen,wo kein Apfel drin gespeichert ist. Dann möchte ich da den Apfel speichern. Wie mache ich das am günstigsten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392721</guid><dc:creator><![CDATA[Trille]]></dc:creator><pubDate>Fri, 26 Oct 2007 18:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 19:12:01 GMT]]></title><description><![CDATA[<p>Kontext, Kontext, Kontext!</p>
<p>Leg dein konkretes Problem dar oder adaptiere es mit Äpfeln, Orangen, was auch immer. Aber ohne Kontext kann man dir schlecht helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392724</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 26 Oct 2007 19:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 19:15:25 GMT]]></title><description><![CDATA[<p>Hmm, ich dachte das währe eindeutig. Ich möchte in dem Apfel-Array den ersten freien Platz finden, wo noch kein Apfel gespeichert wurde. Da steht bei mir der Kommentar im Quelltext, dass das so nicht funktioniert. Ich brauche irgendeine Möglichkeit oder Idee, wie ich das erreichen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392728</guid><dc:creator><![CDATA[Trille]]></dc:creator><pubDate>Fri, 26 Oct 2007 19:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 19:28:33 GMT]]></title><description><![CDATA[<p>Pffft.</p>
<p>Trille schrieb:</p>
<blockquote>
<p>Hmm, ich dachte das währe <em>[sic]</em> eindeutig.</p>
</blockquote>
<p>Nein.</p>
<p>Trille schrieb:</p>
<blockquote>
<p>Ich möchte in dem Apfel-Array den ersten freien Platz finden, wo noch kein Apfel gespeichert wurde.</p>
</blockquote>
<p>Das ist das mehr oder weniger einzige was du konkret gesagt hast. Aber was meinst du überhaupt mit &quot;freier Platz&quot;?</p>
<p>Trille schrieb:</p>
<blockquote>
<p>Da steht bei mir der Kommentar im Quelltext, dass das so nicht funktioniert.</p>
</blockquote>
<p>Oh, es funktioniert nicht? Stimmt, du hast recht, da steht's ja: &quot;// geht irgendwie nicht&quot;. Wahnsinnig hilfreich, der Kommentar, wirklich.</p>
<p>Trille schrieb:</p>
<blockquote>
<p>Ich brauche irgendeine Möglichkeit oder Idee, wie ich das erreichen kann.</p>
</blockquote>
<p>Gut, schau her:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

typedef std::vector&lt;apfel&gt; korb;

void add_apfel( korb&amp; k, int durchmesser, int gueteklasse)
{
  k.push_back(apfel(durchmesser, gueteklasse));
}
</code></pre>
<p>Bringt dich das nicht weiter, siehe oben:</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p>finix&quot;&gt;Leg dein konkretes Problem dar oder adaptiere es mit Äpfeln, Orangen, was auch immer. Aber ohne Kontext kann man dir schlecht helfen.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1392734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392734</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 26 Oct 2007 19:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 19:31:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">aepfel = new Apfel[maximaleApfelAnzahl];
</code></pre>
<p>Hier legst du N Äpfel an, die hier auch direkt mit dem Standard-Konstruktor initialisiert werden.</p>
<pre><code class="language-cpp">aepfel[i] = NULL;       //geht irgendwie nicht
</code></pre>
<p>Hier versuchst du, einem Objekt Apfel den Wert 0 zuzuweisen, klar geht das nicht. (Es sei denn es gäb den passenden Zuweisungsoperator bla bla bla)</p>
<p>Ich denke, das was du suchst, ist ein Array von Zeigern auf Äpfel.<br />
Das sieht dann so aus:</p>
<pre><code class="language-cpp">Apfel **aepfel;
</code></pre>
<p>(Zeiger auf Zeiger, da Zeiger implizit als Array gehandelt werden)</p>
<p>Am besten wäre aber, du benutzt gleich einen Container der Standardbibliothek (std::vector würde sich anbieten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392735</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 26 Oct 2007 19:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 22:39:50 GMT]]></title><description><![CDATA[<p>@ Trille:<br />
Du kommst von Java oder?<br />
In C++ erstellst du kein Array aus Referenzen, die du dann erstmal mit NULL initialisierst.<br />
Sondern das Array enthält sobald ihm mit new Speicher zugewiesen hast, auch Objekte.<br />
Ein Container aus der C++-Standardbibliothek würde dir whs helfen, oder du löst es eben per &quot;Apfel **aepfel&quot; - beachte auch, dass du unter C++ jeden Speicher, den du dynamisch per new allozierst auch wieder freigeben musst. Nochmal mein Verweis an die Standardbibliothek, die nimmt dir in dem Fall diese Aufgaben ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392786</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Fri, 26 Oct 2007 22:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 23:12:00 GMT]]></title><description><![CDATA[<p>Richtig, ich komme von Java, es ist alles noch etwas ungewohnt,aber so langsam komme ich dahinter. Sicherlich sind viele Fragen noch stupide, aber mit der Zeit lernt man dazu. Die Pointer usw. sind noch ziemlich schwer.</p>
<p>Ich danke erstmal für die Tipps, das klappt soweit auch ganz gut. Jetzt habe ich noch zwei Probleme. Ich poste jetzt mal die ganze Klasse.<br />
Header</p>
<pre><code class="language-cpp">class ServerManager
{

public:
	ServerManager();
	~ServerManager();
	void AddServer(int port, void (*funct)(SOCKET *sock, char* buffer));	
	HANDLE StartServer(int port);
	Server&amp; GetServer(int port);

private:

	int maxClients;
	std::vector&lt;Server&gt; servers;
};

DWORD WINAPI ThreadFunc(LPVOID Data);
</code></pre>
<pre><code class="language-cpp">ServerManager::ServerManager()
{

}

ServerManager::~ServerManager()
{
	std::vector&lt;Server&gt;::iterator iter;
	for(iter = servers.begin(); iter != servers.end(); iter++)
    {
		//Server x = ((Server)(*iter));  #3
		//delete &amp;x;
    }
}

void ServerManager::AddServer(int port, void (*funct)(SOCKET *, char *))
{
	Server *server = new Server(port, funct);
	servers.push_back(*server);	
}

Server&amp; ServerManager::GetServer(int port)
{
	std::vector&lt;Server&gt;::iterator iter;
	for(iter = servers.begin(); iter != servers.end(); iter++)
    {
		if( ((Server)(*iter)).getPort() == port)
		{
			return ((Server)*iter);
		}
    }
	return (servers.at(0));
}

HANDLE ServerManager::StartServer(int port)
{
	HANDLE hThread; 
	DWORD dwThreadID; 
	Server server = GetServer(port);
        printf(&quot;%i\n&quot;, server.getPort());       //#1
 	hThread = CreateThread( NULL, 0, ThreadFunc, &amp;server, 0, &amp;dwThreadID);
	return hThread;
}

DWORD WINAPI ThreadFunc(LPVOID Data) 
{ 
	printf(&quot;%i\n&quot;,((Server*)Data)-&gt;getPort());     //#2
	((Server*)Data)-&gt;run();
	return(0); 
}
</code></pre>
<p>Eine kurze Beschreibung:<br />
Die Klasse ist dazu gedacht, mehrere Server gleichzeitig zu verwalten. Mit addServer werden die Server hinzugefügt. getServer liefert mit den Server, der auf einem bestimmten Port läuft (ist eindeutig). StartServer startet den angegebenen Server (erstellt einen eigenen Thread).</p>
<p>Jetzt brennts noch an 3 Stellen (Markiert mit #1, #2 und #3)</p>
<p>Ich rufe das ganze folgendermassen auf:</p>
<pre><code class="language-cpp">ServerManager *x = new ServerManager;
	x-&gt;AddServer(90, NULL);
	x-&gt;AddServer(81, NULL);
	hThread = x-&gt;StartServer(81);
</code></pre>
<p>Das bedeutet, dass die Ausgabe bei #1 und #2jeweils 81 sein müsste. Es kommt jedoch irgendwas mit -833243454 bei #1 und 1 bei #2 heraus. Was mache ich falsch?</p>
<p>Wie kann ich im Destruktor alle erstellten Server wieder löschen? (#3)</p>
<p>Vielen Dank schonmal im Vorraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392797</guid><dc:creator><![CDATA[Trille]]></dc:creator><pubDate>Fri, 26 Oct 2007 23:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Fri, 26 Oct 2007 23:31:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">ServerManager::ServerManager()
{

}

ServerManager::~ServerManager()
{
 //Der Destruktor übernimmt das aufräumen, da du Instanzen von Server in dem vector hast, und keine Pointer.
}

void ServerManager::AddServer(int port, void (*funct)(SOCKET *, char *))
{
    Server server = Server(port, funct);
    servers.push_back(server);    
}

Server&amp; ServerManager::GetServer(int port)
{
    std::vector&lt;Server&gt;::iterator iter;
    for(iter = servers.begin(); iter != servers.end(); iter++)
    {
        if(iter-&gt;GetPort() == port)
        {
            return *iter;
        }
    }
    return (servers.at(0)); //Bist du dir sicher, dass auch ein Server im Vector existiert?
}

HANDLE ServerManager::StartServer(int port)
{
    HANDLE hThread; 
    DWORD dwThreadID; 
    Server server = GetServer(port);
        std::cout &lt;&lt; server.getPort() &lt;&lt; std::endl       //C++ ;)
     hThread = CreateThread( NULL, 0, ThreadFunc, &amp;server, 0, &amp;dwThreadID); //Vorsicht, der Server liegt nur auf dem Stack und wird gelöscht wenn der Scope verlassen wird.
    return hThread;
}

DWORD WINAPI ThreadFunc(LPVOID Data) 
{ 
    std::cout &lt;&lt; reinterpret_cast&lt;Server*&gt;(Data)-&gt;getPort() &lt;&lt; std::endl; 
    reinterpret_cast&lt;Server*&gt;(Data)-&gt;run();
    return(0); 
}
</code></pre>
<p>So oder so ähnlich müsste es stimmen, allerdings musst du dir das mit dem Thread-Aufruf nochmal überdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392809</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 26 Oct 2007 23:31:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Sat, 27 Oct 2007 07:55:53 GMT]]></title><description><![CDATA[<p>Vielen Dank,ich habe den Vector jetzt so umgeschrieben, dass er nicht mehr den Server an sich hält, sondern die Pointer darauf also</p>
<p>vector&lt;Server*&gt;</p>
<p>Dann funktionierts auch im Destruktor per Iterator. Ist das ganze jetzt auch noch kritisch hinsichtlich des Threads?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392851</guid><dc:creator><![CDATA[Trille]]></dc:creator><pubDate>Sat, 27 Oct 2007 07:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Sat, 27 Oct 2007 08:16:22 GMT]]></title><description><![CDATA[<p>Also ... jetzt nochmal von vorne ... wir sind in C++, d.h. kann man wunderschön Vererbung nutzen! Nun legen wir uns also eine Basisklasse Server an, die wir dann immer ableiten können um die einzellnen Datenverarbeitungen anzupassen!</p>
<pre><code class="language-cpp">class Server
{
public:
	Server(std::size_t port) : m_socket(0), m_port(port) {}
	Server(::SOCKET const&amp; s) : m_socket(s) {}

public:
	virtual void handle_message(char*) {}
	std::size_t const&amp; get_port() const { return m_port; }
	virtual void run() { /* ... */ }

private:
	::SOCKET	m_socket;
	std::size_t	m_port;
};
</code></pre>
<p>Die Klasse ist jetzt nur einmal grob geschrieben, natürlich musst du sie deinen wünschen gemäß anpassen. handle_message entspricht deinem Funktionszeiger, den du im Konstruktor übergeben hast. Funktionszeiger sind aus C-Zeiten ... wenn du sowas haben willst, dann nur auf Memberfunktionen ^^ und das ist etw. komplizierter. Wenn du jetzt also die Verarbeitung von deinen Daten umändern willst, legst du dir einen Klasse an, die vom Typen Server erbt und gibst bei add_server als Template-Parameter halt den Namen deiner neuen Klasse an.<br />
Die Klasse ServerManager optimiert und für Vererbung angepasst:</p>
<pre><code class="language-cpp">class ServerManager
{
public:
	~ServerManager() { for (std::vector&lt;Server*&gt;::iterator it(m_servers.begin()); it != m_servers.end(); ++it) delete (*it); }
public:
	template&lt;typename T&gt;
	void add_server(std::size_t port) { m_servers.push_back(new T(port)); }
    ::HANDLE start_server(std::size_t);
    Server&amp; get_server(std::size_t);
    Server const&amp; get_server(std::size_t) const;

private:
	static DWORD WINAPI fnThread(LPVOID);

private:
    std::size_t				m_maxclient;
    std::vector&lt;Server*&gt;	m_servers;
};
</code></pre>
<pre><code class="language-cpp">Server&amp; ServerManager::get_server(std::size_t port)
{
    for(std::vector&lt;Server*&gt;::iterator it = m_servers.begin(); it != m_servers.end(); ++it)
        if ((*it)-&gt;get_port() == port) return *(*it);
    throw std::runtime_error(&quot;server not found&quot;);
}

Server const&amp; ServerManager::get_server(std::size_t port) const
{
    for (std::vector&lt;Server*&gt;::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it)
        if ((*it)-&gt;get_port() == port) return *(*it);
    throw std::runtime_error(&quot;server not found&quot;);
}

::HANDLE ServerManager::start_server(std::size_t port)
{
    if (m_servers.size() &gt;= m_maxclient) throw std::out_of_range(&quot;max client&quot;);

	Server&amp; server = get_server(port);
    std::clog &lt;&lt; &quot;Server an Port &quot; &lt;&lt; server.get_port() &lt;&lt; &quot; erstellen.&quot; &lt;&lt; std::endl;
    DWORD dwThreadID;
	return ::CreateThread(NULL, 0, &amp;ServerManager::fnThread, &amp;server, 0, &amp;dwThreadID);
}

DWORD WINAPI ServerManager::fnThread(LPVOID data)
{
    Server* pInstance = static_cast&lt;Server*&gt;(data);
    std::clog &lt;&lt; &quot;Server an Port &quot; &lt;&lt; pInstance-&gt;get_port() &lt;&lt; &quot; starten.&quot; &lt;&lt; std::endl;
    pInstance-&gt;run();

    return 0;
}
</code></pre>
<p>soo <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="🙂"
    /> So sieht die Klasse doch schon viel besser aus <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1392856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392856</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sat, 27 Oct 2007 08:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Sat, 27 Oct 2007 10:09:38 GMT]]></title><description><![CDATA[<p>Kannst du mir bitte noch kurz erklären, was diese Methode macht und was der Unterschied zu der anderen getServer-Methode ist?</p>
<pre><code class="language-cpp">Server const&amp; ServerManager::get_server(std::size_t port) const
{
    for (std::vector&lt;Server*&gt;::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it)
        if ((*it)-&gt;get_port() == port) return *(*it);
    throw std::runtime_error(&quot;server not found&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1392910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392910</guid><dc:creator><![CDATA[Trille]]></dc:creator><pubDate>Sat, 27 Oct 2007 10:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Objektarray on Sat, 27 Oct 2007 10:14:57 GMT]]></title><description><![CDATA[<p>Hmm klar <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="🙂"
    /> Also ... im Unterschied zu der anderen Methode, gibt die Funktion eine Referenz eines konstanten Objektes zurück und die Funktion selbst ist auch konstant. Das bringt dir Performancevorteile ...</p>
<pre><code class="language-cpp">void foo(ServerManager const&amp; manager) { Server const&amp; server = manager.get_server(1234); }
</code></pre>
<p>... So lange du an Server nichts veränderst, ist diese Methode klar zu bevorzugen <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>
<pre><code class="language-cpp">std::vector&lt;T&gt;::const_iterator
</code></pre>
<p>ist die Version eines</p>
<pre><code class="language-cpp">std::vector&lt;T&gt;::iterator
</code></pre>
<p>, die auch &quot;konstant&quot; ist ... guck dir einfach mal nen guten Text zu const-correctness an ^^</p>
<p>Achja und zum Unterschied zu deinem Code wird am Ende eine Exception geworfen, wenn get_server fehlschlägt ... du gibst einfach den 1. besten Server zurück <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="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392911</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sat, 27 Oct 2007 10:14:57 GMT</pubDate></item></channel></rss>